关于递归返回值的一个问题

function fibonacciCatch(num) {
  let cache = [1, 1];
  (function fibonacci(n) {
    if(typeof cache[n] == 'number') {
      return  cache[n]
    } else {
      // 这里如果没有return为何不行
      return cache[n] = fibonacci(n - 1) + fibonacci(n - 2)
    }
  })(num - 1);
  return cache;
}
console.log(fibonacciCatch(4))   //[ 1, 1, 2, 3 ]

如果不写上面注释中的那个return ,那么会生成[1,1,2,NaN]
我的理解是那一句不就是相当于给数组的第n项复制嘛,赋值之后完全是可以再用来进行运算的,为何还要return 呢?
最近在初学算法,在递归这边有时候总是感觉绕不过来,请大佬帮忙解释详细些,谢谢啦

阅读 1.5k
评论
    6 个回答

    如果不加return,运行FobonacciCatch(4)时的有效代码等价于:

    let cache = [1, 1];
    cache[3] = fibonacci(2) + fibonacci(1);
    return cache;

    其中求cache[3]时,进行两次递归函数调用,用两次函数调用的返回值相加

    fobonacci(1)

    if成立等价于如下代码:

    return cache[1];

    即函数调用返回值为1。

    fobonacci(2)

    if不成立,有效代码为:

    cache[2] = fibonacci(1) + fobonacci(0);

    上述代码确实通过cache[2] = 1 + 1;cache[2]而有值了,然而此次函数调用没有显式返回值,因此也就是undefined

    计算cache[3]

    因此cache[3] = undefined + 1,从而是NaN

    return cache;

    因此最后的cache[1,1,2,NaN]

      • 2.7k

      fibonacci(n - 1) + fibonacci(n - 2) 要做这个加法 fibonacci必须得返回值吧 要不就是undefined+undefined了

        • 5.2k

        楼主应该说的是里面那一层灭有return的情况吧

        function fibonacciCatch(num) {
          let cache = [1, 1];
          (function fibonacci(n) {
            if(typeof cache[n] == 'number') {
              return  cache[n]
            } else {
              cache[n] = fibonacci(n - 1) + fibonacci(n - 2)
            }
          })(num - 1);
          return cache;
        }

        如果里面函数fibonacci没有返回值,那么在执行

        fibonacci(n - 1) + fibonacci(n - 2)

        这一句的时候,几回出现两个函数相加的情况,所以就返回NaN

        执行
        
        fibonacciCatch(6)
        
        输出
        
        [1, 1, 2, NaN, NaN, NaN]

          cache数组中的值(从第三项开始)是来自 fibonacciCatch 这个函数的返回值,如果你没有return 函数的默认返回值就是 undefined的

            你要拿到计算后的值,不return的话你就是undefined+undefined 最终会是NaN写return是为了让他拿到上一次计算的值

              • 1
              • 新人请关照

              您好,我是猎头David,受一家非常棒的公司(百亿美金以上独角兽)HR特意点名委托联系您,我正在为 他们招聘前端的负责人(管理前端人数40人+),非常不错的机会,您手机可以发我一下嘛 期待和您电话聊一下 感谢!我的电话微信18616723738

                撰写回答

                登录后参与交流、获取后续更新提醒

                相似问题
                推荐文章