斐波那契數列
題目描述
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。
n<=39
實現代碼
function Fibonacci(n)
{
var arr = [];
arr[0] = 0;
arr[1] = 1;
for(var i = 2; i <= n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n];
}
思路
看到題目,首先想到的就是遞歸,f(n) = f(n-1) + f(n-2),這樣看來,這一題只要兩行代碼就搞定了。
if (n<=1) return n
else return Fibonacci(n-1) + Fibonacci(n-2)
然而,測試用例中準備了一個超大的n來讓Stack Overflow。
Z31~F09BCFQ@R$N8T[2]4XJ.png
為什么會這樣?因為重復的計算。舉個例子:
Fibonacci(4) = Fibonacci(3) + Fibonacci(2);
= Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
= Fibonacci(1) + Fibonacci(0) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
由于我們的代碼并沒有記錄Fibonacci(1)和Fibonacci(0)的結果,對于程序來說它每次遞歸都是未知的,因此光是n=4時f(1)就重復計算了3次之多。
那么該如何求解呢?
以一定的空間代價來避免由重復計算造成的棧空間浪費。