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

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 呢?
最近在初学算法,在递归这边有时候总是感觉绕不过来,请大佬帮忙解释详细些,谢谢啦

阅读 5.7k
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]

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

楼主应该说的是里面那一层灭有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是为了让他拿到上一次计算的值

新手上路,请多包涵

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题