首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript fibonacci回忆录

javascript fibonacci回忆录
EN

Stack Overflow用户
提问于 2015-11-22 23:27:11
回答 9查看 7.9K关注 0票数 2

为了计算fibonacci序列的第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);
}

这如预期的那样起作用。现在,我试图将计算出来的索引存储在一个对象中:

代码语言:javascript
复制
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);
    }
}

我知道这实际上并没有提高性能,因为我没有访问结果对象,但我想先检查我的结果对象在回忆录之前是否被正确填充。不幸的是,事实并非如此。对于fibonacci(9),我得到:

代码语言:javascript
复制
Object {0: 0, 1: 1, 2: 2, 3: 3, 4: NaN, 5: NaN, 6: NaN, 7: NaN, 8: NaN, 9: NaN}

为什么我得到的指数NaN超过3?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2016-02-13 23:12:10

通过发布@Juhana的评论来结束这个答案的循环:

“因为当索引>2时,函数不会返回任何内容”

票数 0
EN

Stack Overflow用户

发布于 2020-10-26 04:46:29

这是我的解决方案:

代码语言:javascript
复制
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));
票数 5
EN

Stack Overflow用户

发布于 2021-09-03 11:56:19

下面是使用"Helper Method Recursion“的解决方案:

代码语言:javascript
复制
function fib(n) {
  const memorize = {};

  function helper(n) {
    if (n in memorize) return memorize[n];
    if (n < 3) return 1;
    return memorize[n] = helper(n - 1) + helper(n - 2);
  }

  return helper(n);
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33861501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档