前端 —— JavaScript 基础篇 --- 递归
递归:
就是函数自己调用自己。是循环运算的一种算法模式。常用于解决一些数学运算,如阶乘函数、幂函数和斐波那契数列。
使用时要 注意 以下两部分:
递归调用的过程。
递归终止的条件(出口)。
在没有限制的情况下,递归运算会无终止地自身调用,所以 在递归运算中要结合 条件语句(if)进行控制,只有在某个条件成立时才允许执行递归,否则不允许调用自身。
function dg(num){
if(num <= 0){
return 0;
}else{
return num + dg(num - 1)
}
}
console.log(dg(5)) // 15
递归就是 :
走到出口的时候,再向上一步一步的赋值计算后,返回结果。那当 num = 0 了, return出之后 还有一大堆队列等着, return num + dg(num - 1) 这些都没有实际的运算结果呢。return 0; ;到了0,就把0赋值进去,然后一个一层层的向上赋值最终达到dg(5),然后把计算结果return 出去。。
return num + dg(num - 1) 这一直没有结果 等着结果出来了在 return出去,这里的 return 和 之前所理解的 return 有所不同。
看下面的一张图就明白了了
伙伴们可以再来验证一下
【实例1:乘阶】
var f = function (x) {
if (x < 1) return 1; //递归终止条件
else{
return x * f(x - 1); //递归调用过程
}
}
console.log(f(3)); //返回3的阶乘值为6
斐波那契数列 : 1、1、2、3、5、8、13、21、34
【实例2:斐波那契数列 】
function fb(n){
if(n === 1 || n === 2){
return 1;
}
return fb(n - 1) + fb(n - 2);
}
console.log(fb(8)); // 21
/*
fb(6) = fb(5) + fb(4)
fb(5) = fb(4) + fb(3)
fb(4) = fb(3) + fb(2)
fb(3) = fb(2) + fb(1)
fb(2) = 1
fb(1) = 1
8 = fb(6) = 5 + 3
fb(5) = 3 + 2
fb(4) = 2 + 1
fb(3) = 1 + 1
fb(2) = 1
fb(1) = 1
*/
斐波那契数列 注解 代码中颜色浅
/* 先看左侧一列 再看看右侧一列
fb(6) = fb(5) + fb(4) 8 = fb(6) = 5 + 3
fb(5) = fb(4) + fb(3) fb(5) = 3 + 2
fb(4) = fb(3) + fb(2) fb(4) = 2 + 1
fb(3) = fb(2) + fb(1) fb(3) = 1 + 1
fb(2) = 1 fb(2) = 1
fb(1) = 1 fb(1) = 1
*/
总结一下 递归的两个重要因素:
递归调用的过程。
递归终止的条件(出口)。把问题一层一层的分解下去,但是不能无限循环下去。
注意:递归容易堆栈溢出。递归非常耗费内存,因为需要同时保存成千上百个调用帧,当数据规模较大的时候很容易发生“栈溢出”错误。所以要谨慎使用递归
好啦 递归的内容就总结到这里。我的文章都是学习过程中的总结,如果发现错误,欢迎留言指出,我及时更正。
本文地址:https://blog.csdn.net/dingdinglaila/article/details/107378109