javascript - 使用动态编程的斐波那契系列中的 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)
希望这会有所帮助:)
解决方案
你在函数return
内部getFib
是不够的,你缺少的部分是你还需要return
从. 不过,为此引入一个辅助变量可能会有所帮助:getFib
recursiveDynamicProgramming
function recursiveDynamicProgramming() {
let cache = {};
var getFib = function(n) { // or just "function getFib(n) {"
…
};
return getFib;
// ^^^^^^^^^^^^^^
}
推荐阅读
- visual-studio-2017 - 使用 Libman 安装的客户端库未显示在 Visual Studio 2017 的解决方案资源管理器中
- javascript - 用JS计算智能手机的基本方向
- javascript - 如何在 Python 脚本中访问 Atom 工作区目录
- flutter - 如何使用 Firebase_Camera_ml_vision 从实时人脸检测中拍照
- mongodb - 如何在mongodb中打开一个集合
- aws-lambda - terraform中的文件功能未检测到路径中的文件
- php - PHP 似乎将 null 定义为自身。这是如何运作的?
- java - 检查两个字符串是否包含相同顺序的相同字符
- websocket - Azure Kubernetes 集群上的 Websocket 实现错误不工作
- react-native - 为什么复选框在 React Native 中不起作用?