美文网首页程序员
JavaScript递归函数过程和思路

JavaScript递归函数过程和思路

作者: zouCode | 来源:发表于2017-07-06 22:54 被阅读95次

玩了一个月,好久没打代码了,有点面生,遇到一道递归题目不会做,来分析一下递归函数

递归函数:说白了就是自己调用自己。

自调

function mine () {
  mine ();
  console.log("我在调用自己!")  //别瞎试,没有终止条件,变成死循环,浏览器会爆炸!
}
mine();

变量 + 函数

// 一个简单的累加函数  
var add = function (x) {  
    if (x == 1) {  
        return 1;  
    } else {  
        return x + add(x - 1);  
    }  
};  
console.log(add(5));// 1 + 2 + 3 + 4 + 5 = 15

分析一波,为什么要返回 x + add(x - 1)?
看咱们题目是累加,累加什么意思,就是 1 + 2 + 3 + ... + n
所以我们求5的累加,是不是可以变成 5 + (5 - 1) 变成 n 的累加的话,就是 n + ( n - 1 )
所以就得出为什么返回 x + add(x - 1)

同样,我们思考一下阶乘,n的阶乘 n! = 1 * 2 * 3 * ... * n
可以得出 n * (n - 1)

两个一对比,一看就明白了,这不是就是我们初中/高中数学学的找规律的题目么!

后端用递归函数比较多,所以对于后端的开发人员来说,递归小菜一碟,不值得说。

但对于我们前端,特别是刚入门的前端来说,这个就不是很了解,

所以有时候遇到复杂的递归函数就一面懵逼(what fuck !这写的什么鬼代码!),

因此先从简单的累加函数分析一下递归函数的运行过程!

运行过程

//首先执行函数         add(5)
                  x=1   /   \ x!=1
//然后判断运行    返回 1      返回 5 + add(4) 
                               \     |
                                4 + add(3)
                                 \     |
                                  3 + add(2)
                                   \     |
                                      2 + add(1)
                                      \     |
                                         1 + add(0)
//执行add(0)就报错了
//所以结果就是 5 + 4 + 3 + 2 + 1 = 15                        

说完上面简单的,再来一个复杂点的递归。

函数 + 函数

//经典斐波拉契题目,求数列中的第20项,1,1,2,3,5,8,13,......

//按上面思路,我们找下规律,
//可以发现,从第3项开始,
//前面1位 + 前面2位 = 当前数列的值
//也就是说,当我求第3项的值时 第3项 = 第2项 + 第1项
//若我求第n项的值得时候 第n项 = 第n-1项 + 第n-2项
//ok,我们开始写代码

function num (n) {
  if (n == 1 || n == 2) {
        return 1;
  } else {
        return num(n-1) + num(n-2);
  }
}
console.log(num(20))

我们自己写下运行过程,看看对不对

运行过程

//我取n = 5,看结果是不是等于 5
//以下内容 num(n) 我就直接写(n)了
                                num(5)
                            /           \
                          (4)           (3)
                          /  \          /  \
                        (3)  (2)     (2)    (1)
                        / \   / \    / \
                      (2) (1)(1)(0) (1)(0)
                      / \
                     (1)(0)
//树形图中间不用看,我们将每条支线最后的形参取出来
//得到(1) (0) (1) (1) (0) (1) (0) (1)
//因为形参为0时,会报错,所以我们取形参为1的支线
//得到(1) (1) (1)  (1)  (1)
//形参为1时返回1,用 + 连接起来
//得到 1 + 1 + 1 + 1 + 1 = 5
//所以我们找的规律没错!

看完这个过程,再按找规律的思路,去做递归编程题目时,妈妈再也不用担心我不知道reuturn后面接什么东西了!

相关文章

  • JavaScript递归函数过程和思路

    玩了一个月,好久没打代码了,有点面生,遇到一道递归题目不会做,来分析一下递归函数递归函数:说白了就是自己调用自己。...

  • 前端算法学习-前篇

    递归 JavaScript中允许函数递归调用,示例: 当一个函数呗递归调用时,递归没有完成,函数的计算结果会被暂时...

  • JavaScript递归函数

    JavaScript 支持函数的递归调用。 所谓递归函数,就是在函数体内调用函数本身。 使用递归函数的一个常见例子...

  • 深刻理解递归———通过栈图来理解

    函数调用另外一个函数是合法的;函数调用自己也是合法的。调用自己的过程称为递归函数,这个执行过程叫做递归。 递归在数...

  • 递归,回溯

    什么叫递归:函数在运行时调用自己,这个函数就叫递归函数,调用的过程叫做递归; 递归的特点:1、递归函数必须要有终止...

  • js简单深拷贝

    思路:1递归子元素,子元素传入函数,基本数据类型不用递归直接返回,{}和[]需要遍历 效果

  • Javascript 递归函数

    当一个函数在执行时调用了自身,那么这个函数就是递归函数。递归函数经常用来解决一些循环反复的问题。我们首先列举一些递...

  • JavaScript函数高级

    一、函数的递归(1) 什么是递归函数递归recursion,描述了函数在自己的内部代码中调用自身的过程(2) 递归...

  • javascript基础函数

    获取url参数 JavaScript加载样式文件 匹配多个转行的空格 递归函数 列队递归函数 获取对象的样式 给元...

  • 通过递归,计算斐波那契数列的代码

    出处 函数 - JavaScript 教程 - 网道 ---- 圆括号运算符,return 语句和递归 代码 上面...

网友评论

    本文标题:JavaScript递归函数过程和思路

    本文链接:https://www.haomeiwen.com/subject/hpbkhxtx.html