首页 > 解决方案 > 使用动态编程的斐波那契系列中的 Javascript 闭包

问题描述

我正在尝试找出 Javascript 中的闭包。

尝试使用 DP 计算斐波那契数列。这里我的输入将是索引:索引 = 10 输出:55(根据斐波那契序列:0,1,1,2,3,5,8,13,21,34,55..)

下面的版本是一个工作代码:

function recursiveDynamicProgramming(){
let cache = {};
//use javascript closure method
return function getFib(n){
//var getFib = function(n){ : When i assign function to this variable. I am getting undefined error. Although it has return value :(
    if(n in cache){//if(cache[n])
        return cache[n];
    } else{
        if(n < 2){
            return n;
        }else{
            cache[n] = getFib(n - 2) + getFib(n - 1);
            return cache[n];
        }
    }
}
}  
const dynamicProdFib = recursiveDynamicProgramming();
console.log(dynamicProdFib(10)); //Output = 55, Input = 10
//console.log(dynamicProdFib.getFib(10)); //This should give me the same result as the variable getFib is defined in the program.

所以在这里,如果你可以参考注释代码

//var getFib = function(n){ : When i assign function to this variable. I am getting undefined error. 
 Although it has return value //Or we can use this.getFib = function(n)

但是当我尝试调用这个方法时,我得到了未定义的错误。这仅仅意味着我的函数没有返回值。但我在这个函数中返回值。我不确定我在哪里犯错。

我们有几个这个问题的例子,但我无法解决这个问题。请原谅我。感谢您的帮助 :)

更新:感谢@Bergi 指出我的愚蠢错误。

就我而言,我试图将输出称为:

dynamicProdFib.getFib(10)

所以我必须将输出放在一个对象中:

  return {getFib};

或者简单地将输出称为:

return dynamicProdFib(10)

希望这会有所帮助:)

标签: javascriptclosuresfibonacci

解决方案


你在函数return内部getFib是不够的,你缺少的部分是你还需要return从. 不过,为此引入一个辅助变量可能会有所帮助:getFibrecursiveDynamicProgramming

function recursiveDynamicProgramming() {
    let cache = {};
    var getFib = function(n) { // or just "function getFib(n) {"
        …
    };
    return getFib;
//  ^^^^^^^^^^^^^^
}

推荐阅读