javaScript动态编程
我正在学习如何使用记忆,我有这个问题javaScript动态编程,javascript,dynamic-programming,Javascript,Dynamic Programming,我正在学习如何使用记忆,我有这个问题 const memo={ 0: 0, 1: 0, 2: 1 }; 职能部门(n,备忘录){ //不要更改接下来的四行 如果(备忘录中的n)返回备忘录[n]; 常数n1=tribonaci(n-1) 常数n2=tribonaci(n-2) 常数n3=Tribonaci(n-3) //不要更改前四行 //你的代码在这里 如果(n==1 | n==2)返回1; 备注[n]=n1+n2+n3; 返回备忘录[n]; } 控制台日志(Tribonaci(3))您的代码
const memo={
0: 0,
1: 0,
2: 1
};
职能部门(n,备忘录){
//不要更改接下来的四行
如果(备忘录中的n)返回备忘录[n];
常数n1=tribonaci(n-1)
常数n2=tribonaci(n-2)
常数n3=Tribonaci(n-3)
//不要更改前四行
//你的代码在这里
如果(n==1 | n==2)返回1;
备注[n]=n1+n2+n3;
返回备忘录[n];
}
控制台日志(Tribonaci(3))代码>您的代码有两个主要问题:
您创建了一个本地参数memo
,它始终是未定义的
(除非您将其作为参数传递给函数调用),并覆盖了文件范围memo
变量。只需删除它,即可修复您报告的错误
您的终止案例通常必须在递归的开始处。否则你会得到一个无限循环。在再次调用Tribonaci之前,将第二个if
向上移动到
可能会有更多的问题,但这肯定是两个大问题。所以我对它进行了一些重构,现在看起来像这样,但它不会再次传递,它说tribonacci不是一个函数
// const memo = {0: 0, 1: 0, 2: 1};
function tribonacci(n, memo = {}) {
if (n in memo) return memo[n];
if (n === 1 || n === 2) return 1;
// DO NOT CHANGE THE NEXT FOUR LINES
const n1 = tribonacci(n - 1);
const n2 = tribonacci(n - 2);
const n3 = tribonacci(n - 3);
// DO NOT CHANGE THE PREVIOUS FOUR LINES
// Your code here
memo[n] = (n1, memo) + (n2, memo) + (n3, memo);
return memo[n];
}
我确信他们可能希望我使用我注释掉的备忘录对象,但我不确定
函数tribonaci(n=0,memo={}){
如果(备注[n])返回备注[n];
如果(n<2)返回1;
const$n1=n-1;
const$n2=n-2;
const$n3=n-3;
常数n1=备忘录[$n1]| Tribonaci($n1,备忘录)
常数n2=备忘录[$n2]| Tribonaci($n2,备忘录)
常数n3=备忘录[$n3]| Tribonaci($n3,备忘录)
备注[n]=n1+n2+n3;
返回备忘录[n];
}
控制台日志(Tribonaci(3))代码>您需要删除函数定义中的参数
const memo={
0: 0,
1: 0,
2: 1
};
函数tribonaci(n){
//不要更改接下来的四行
如果(备忘录中的n)返回备忘录[n];
常数n1=tribonaci(n-1)
常数n2=tribonaci(n-2)
常数n3=Tribonaci(n-3)
//不要更改前四行
//你的代码在这里
如果(n==1 | n==2)返回1;
备注[n]=n1+n2+n3;
返回备忘录[n];
}
控制台日志(Tribonaci(3))代码>为什么memo
是一个参数?请将您的问题包括用于生成您正在使用的错误消息的参数。修复此错误的唯一方法是更改表示不更改的行。