欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

前端 —— JavaScript 基础篇 --- 递归

程序员文章站 2022-03-14 20:09:14
递归:就是函数自己调用自己。是循环运算的一种算法模式。常用于解决一些数学运算,如阶乘函数、幂函数和斐波那契数列。使用时要注意以下两部分:递归调用的过程。递归终止的条件(出口)。在没有限制的情况下,递归运算会无终止地自身调用,所以在递归运算中要结合 条件语句(if)进行控制,只有在某个条件成立时才允许执行递归,否则不允许调用自身。function dg(num){ if(num <= 0......

递归:

     就是函数自己调用自己。是循环运算的一种算法模式。常用于解决一些数学运算,如阶乘函数、幂函数和斐波那契数列。

     使用时要 注意 以下两部分:

            递归调用的过程。

            递归终止的条件(出口)。

     在没有限制的情况下,递归运算会无终止地自身调用,所以 在递归运算中要结合 条件语句(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:乘阶】

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.  

 

 

本文地址:https://blog.csdn.net/dingdinglaila/article/details/107378109