前端 —— 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(8) = fb(7) + fb(6)
   fb(7) = fb(6) + fb(5)

   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


21 = fb(8) = 13 + 8
13 = fb(7) = 8 +5

8 =  fb(6) = 5 + 3
5 =  fb(5) = 3 + 2
3 =  fb(4) = 2 + 1
2 =  fb(3) = 1 + 1
1 =  fb(2) = 1
1 =  fb(1) = 1
*/

斐波那契数列 注解     代码中颜色浅

/*  先看左侧一列     再看看右侧一列  

    fb(8) = fb(7) + fb(6)                   21 =    fb(8) = 13 + 8

    fb(7) = fb(6) + fb(5)                   13 =     fb(7) = 8 +5

    fb(6) = fb(5) + fb(4)                    8 =     fb(6) = 5 + 3

    fb(5) = fb(4) + fb(3)                    5 =     fb(5)  =  3 + 2

    fb(4) = fb(3) + fb(2)                    3 =     fb(4)  =  2 + 1

    fb(3) = fb(2) + fb(1)                    2 =     fb(3)  = 1 + 1

    fb(2) = 1                                     1 =     fb(2)  = 1

    fb(1) = 1                                     1 =     fb(1) = 1     

                                                                                       */

总结一下 递归的两个重要因素:

          递归调用的过程。

          递归终止的条件(出口)。把问题一层一层的分解下去,但是不能无限循环下去。

注意:递归容易堆栈溢出。递归非常耗费内存,因为需要同时保存成千上百个调用帧,当数据规模较大的时候很容易发生“栈溢出”错误。所以要谨慎使用递归

 

好啦 递归的内容就总结到这里。我的文章都是学习过程中的总结,如果发现错误,欢迎留言指出,我及时更正。

  1.  

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值