为了计算斐波纳契数列的第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);
}
}
我知道这实际上并没有提高性能,因为我没有访问结果对象,但我想先检查我的结果对象是否在记忆之前正确填充。不幸的是,事实并非如此。对于斐波那契(9),我得到:
Object {0: 0, 1: 1, 2: 2, 3: 3, 4: NaN, 5: NaN, 6: NaN, 7: NaN, 8: NaN, 9: NaN}
为什么我为3岁以上的指数获得NaN?
答案 0 :(得分:1)
递归斐波那契消耗过多的处理能力,这对应用程序不利。为了改善这一点,我们使用了记忆化。将计算结果存储在Array中。因此,接下来,当出现相同的值时,它将仅从计算得出的数组中返回存储的值。
function memoizeFabonaci(index, cache = []) {
// console.log('index :', index, ' cache:', cache)
if (cache[index]) {
return cache[index]
}
else {
if (index < 3) return 1
else {
cache[index] = memoizeFabonaci(index - 1, cache) + memoizeFabonaci(index - 2, cache)
}
}
return cache[index];
}
let a = 15
console.log('Memoize febonaci', memoizeFabonaci(a))
答案 1 :(得分:0)
通过张贴@ Juhana的评论来结束这个答案的循环:
&#34;因为当index&gt;时,你的函数不会返回任何内容。 2&#34;
答案 2 :(得分:0)
这是我的解决方案:
function fib(n, res = [0, 1, 1]) {
if (res[n]) {
return res[n];
}
res[n] = fib(n - 1, res) + fib(n - 2, res);
return res[n];
}
console.log(fib(155));
答案 3 :(得分:0)
这是我的解决方案
使用记忆化(动态编程)(时间复杂度约为 O(n))
const results = {}
function fib(n) {
if (n <= 1) return n
if (n in results) {
return results[n]
}
else {
results[n] = fib(n - 2) + fib(n - 1)
}
return results[n]
}
console.log(fib(100))
无记忆化(时间复杂度约为 O(2^n))
function fib(n) {
if (n <= 1) return n
return fib(n - 1) + fib(n - 2)
}
console.log(fib(10))
答案 4 :(得分:-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);