递归:如果一个函数在内部可以调用其本身
,那么这个函数就是递归函数。简单理解:函数内部自己调用自己,这个函数就是递归函数。
递归函数的作用和循环效果一样,可以重复循环。但是由于递归很容易发生“栈溢出”错误,所以必须要加退出条件return
。
function fn() {
fn();
}
fn();
以下展示的就是栈溢出的错误,所以我们必须要加上退出条件。
写一个打印五次我最棒的例子
var num = 1;
function fn() {
console.log('我最棒');
if(num == 5){
return; //必须有退出条件
}
num++;
fn();
}
fn();
结果如图所示:
递归函数求1~n的阶乘 1 * 2 * 3 * 4…n 的例子
function fn(n){
if(n == 1){
return 1;
}
return n * fn(n - 1);
}
console.log(fn(3)); //6
console.log(fn(4)); //24
分析一下上述过程
因为用户输入的是3,那么fn(3)第一次调用 return 3 * fn(2),又因为不能直接输出函数结果,所以fn(2) 继续进行调用 return 3 * (2 * fn(1)).第三次继续调用 fn(1) ,最后得到最后的执行结果 3 * 2 ,结果为6.
再看第二个例子:利用递归函数求费波契数列(兔子序列)1、1、2、3、5、8、13…
思路:
只需要直到用户输入的n 的前面两项(n-1 , n-2)就可以计算出 n 对应的序列值。
function fb(n){
if(n ===1 || n === 2){
return 1;
}
return fb(n - 1) + fb(n - 2);
}
console.log(fb(3)); //2
console.log(fb(6)); //8