前端 —— 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 有所不同。

看下面的一张图就明白了了

前端 —— JavaScript 基础篇 --- 递归(小白也能看的懂)_第1张图片

伙伴们可以再来验证一下 

【实例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     

                                                                                       */

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

          递归调用的过程。

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

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

 

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

  1.  

 

 

你可能感兴趣的:(JavaScript)