递归
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。
简单理解:函数内部自己调用自己, 这个函数就是递归函数
递归属于一个对应的算法 ,所有的算法都是套路。递归能做所有循环能做的事情。
递归的三大要素 (O(logn))
-
找规律
-
找初始值 没有规律的已知条件
-
自己调用自己
注:一个函数可以调用其自身。但在使用递归时,需要注意定义一个从函数退出的条件,否则会进入死循环。
递归函数在解决许多数学问题上起了至关重要的作用,比如计算一个数的阶乘、生成斐波那契数列,等等。
例
问第100个位置的值的什么 2 4 6 8 10 12 14 ... 当前值 = 上一个值 + 2
function fn(n){ if(n == 1){ //没有规律的 return 2 }else{ //有规律的 自己调用自己 return fn(n-1) + 2 } } console.log(fn(100))
1-100的所有偶数和
//2 6 12 20 30 2 + 4 6 + 6 上一个 + 位数*2 function fn1(n){ if(n == 1){ return 2 }else{ return fn1(n-1) + n * 2 } } console.log(fn1(50));
求对应的阶乘 5的阶乘 1 2 6 24
function fn(n){ if(n == 1){ return 1 }else{ return fn(n-1)*n } } fn(5)
1 2 4 7 11 16 问第10位
function fn(n){ if(n == 1){ return 1 }else{ return fn(n-1) + n - 1 } } fn(10)
计算斐波那契数列的第N项
斐波那契数列(Fibonacci sequence),又称黄金分割数列。因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上, 斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3)。
书写递归函数代码第一步:依然是先写结束条件。
1 2 3 5 8 13 问第10位
function fn(n){ if(n == 1){ return 1 }else if(n == 2){ return 2 }else{ return fn(n-2) +fn(n-1) } } fn(10)
99 乘法表
//规律 没一行对应得行号就是他得列数 // 1*1=1 // 1*2=2 2*2=4 // ... for(var i=1;i<10;i++){ var line = "" for(var j=1;j<=i;j++){ line += j + '*' + i + '=' + j*i + ' ' } document.write(line+'<br/>') }
递归的优缺点
优点:结构清晰, 可读性强, 而且容易用数学归纳法来证明算法的正确性, 因此它为设计算法、 调试程序带来很大方便。
缺点:递归算法的运行效率较低, 无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。
注:在使用递归时,要注意对递归函数的参数类型的检查,一定要保证有一个终止处理或计算的出口。否则很容易演变为死循环,从而造成内存溢出。
标签:return,数列,递归,else,斐波,fn From: https://www.cnblogs.com/hofenglang/p/16838972.html