为了计算斐波那契数列的第n个数,我使用了一个熟悉的递归函数:
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);
}
}
我知道这并没有实际提高性能,因为我没有访问结果对象,但在记忆化之前,我想先检查一下我的结果对象是否被正确地填充。不幸的是,它没有被正确填充。对于斐波那契数列的第九项,我得到了:
Object {0: 0, 1: 1, 2: 2, 3: 3, 4: NaN, 5: NaN, 6: NaN, 7: NaN, 8: NaN, 9: NaN}
为什么我在索引超过 3 时会得到 NaN?
2
并从代码中删除if(index===2){ return 2; }
。斐波那契数列是根据不同的要求而确定的,可以是0, 1, 1, 2, 3, 5, 8, ...
或1, 1, 2, 3, 5, 8, ...
。请注意,在任何情况下都有两个1
。 - Scott Sauyet