原生js中关于函数递归的理解

75 阅读2分钟

递归

回调函数

被作为实参传入另一函数,并在该外部函数内被调用,用以来完成某些任务的函数,称为回调函数。

扩展开来说,如果一个函数A虽然不传入函数B,但函数B每次执行,都调用函数A,那么A其实也算是函数B的回调函数,只不过函数A是函数B的隐式回调函数。

递归与回调函数的关系

可以认为,递归就是一个隐式回调函数,它隐式调用了自身。

一般的递归内部,一般return出去的值,就包含了调用自身这个隐式回调函数的返回值。

递归的原则

  • 每一次return出去的fn函数的入参值必定是一个与本轮递归不一样的数值。

    • 为了便于理解,不熟悉之前最好是重新用一个变量把下次递归的实参存起来。

例子

原版的:

   function fn(num) {
        if (num > 100) {
            return 0;
        }

        if (num  % 2 === 0 && num % 3 === 0) {
            return num + fn(num+1)
        }
        return fn(num+1)
    }
    var res = fn(1);
    console.log(res);

实际上中间有一步,就是每一次递归的入参都和之前的不一样。
每一次return出去的fn函数的入参值必定是一个与本轮递归不一样的数值。
为了便于理解,不熟悉之前最好是重新用一个变量把下次递归的实参存起来。

把实参用变量next存起来的版本,就会发现本轮函数里的入参值为num,但下一轮次的递归的入参就是next。而next的值是当前的num+1:

   function fn(num) {
        if (num > 100) {
            return 0;
        }
        var next = num+1;
        if (num  % 2 === 0 && num % 3 === 0) {
            return num + fn(next)
        }
        return fn(next)
    }
    var res = fn(1);
    console.log(res);