2015-11-22 82 views
0

要計算斐波納契數列的第n項,我已經熟悉的遞歸函數:JavaScript的斐波那契記憶化

var fibonacci = function(index){ 
    if(index<=0){ return 0; } 
    if(index===1){ return 1; } 
    if(index===2){ return 2; } 

    return fibonacci(index-2) + fibonacci(index-1); 
} 

可正常工作。現在,我想計算的指數存儲在一個對象:

var results = { 
    0: 0, 
    1: 1, 
    2: 2 
}; 

var fibonacci = function(index){ 
    if(index<=0){ return 0; } 
    if(index===1){ return 1; } 
    if(index===2){ return 2; } 

    if(!results[index]){ 
     results[index] = fibonacci(index-2) + fibonacci(index-1); 
    } 
} 

我知道這是不是實際上提高了性能,因爲我沒有訪問結果對象,但我想先確認一下,我的成績目標是在記憶前正確填寫。不幸的是,事實並非如此。對於斐波納契(9),我得到:

Object {0: 0, 1: 1, 2: 2, 3: 3, 4: NaN, 5: NaN, 6: NaN, 7: NaN, 8: NaN, 9: NaN} 

爲什麼我得到NaN指數超過3?

+0

因爲你的函數不返回任何東西當指數> 2. – JJJ

+0

@Juhana哦,我很愚蠢的人。謝謝。你能否提交答案以便我可以接受? – PDN

+1

與您的問題沒有直接關係,但是如果您預先填充了'results'數組,那麼您爲什麼還需要在函數內顯式測試'index'?另外,我相信'fib(2)'是'1'。 –

回答

0

去張貼@ Juhana的評論結束對這個答案的循環:

「因爲你的函數不返回任何東西,當指數> 2」

-1

我添加了一些補充。

var results = {}; 

var fibonacci = function (index) { 
    if (index <= 0) return 0; 

    if (index == 1 || index == 2) return 1; 

    return fibonacci(index - 2) + fibonacci(index - 1); 
}; 

for (var i = 1; i <= 10; i++) { 
    results[i] = fibonacci(i); 
} 

console.log(results); 
+0

這個答案沒有解決OP想要記憶中間結果的願望。 –