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 呢?
最近在初学算法,在递归这边有时候总是感觉绕不过来,请大佬帮忙解释详细些,谢谢啦
如果不加
return
,运行FobonacciCatch(4)
时的有效代码等价于:其中求
cache[3]
时,进行两次递归函数调用,用两次函数调用的返回值相加。求
fobonacci(1)
if
成立等价于如下代码:即函数调用返回值为1。
求
fobonacci(2)
if
不成立,有效代码为:上述代码确实通过
cache[2] = 1 + 1;
让cache[2]
而有值了,然而此次函数调用没有显式返回值,因此也就是undefined
。计算
cache[3]
因此
cache[3] = undefined + 1
,从而是NaN
。return cache;
因此最后的
cache
为[1,1,2,NaN]
;