添加 Memoization 后斐波那契计算变慢 Javascript
Computing for Fibonacci becomes slower after adding Memoization Javascript
比较两个版本,似乎使用记忆化的版本在理论上应该更快的时候更慢。为什么会这样?
没有记忆:
function fibonacci(n) {
if (n <= 1) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
const start = Date.now();
fibonacci(22);
const duration = Date.now() - start;
console.log(duration);
输出:11
有记忆功能:
function fibonacci(n, dic = {}) {
if (n <= 1) {
return 1;
}
if (dic[n]) {
return dic[n];
}
let res = fibonacci(n - 1) + fibonacci(n - 2);
dic[n] = res
return res
}
const start = Date.now();
fibonacci(22);
console.log(Date.now() - start);
输出:19
在您的记忆版本中,您忘记将 dic
传递到递归调用堆栈。所以它每次都会得到默认值。
当你通过它时,时间在我的机器上降为零(这种测量性能的方法不是特别准确 - 显然它不是零!)
function fibonacci(n, dic = {}) {
if (n <= 1) {
return 1;
}
if (dic[n]) {
return dic[n];
}
let res = fibonacci(n - 1,dic) + fibonacci(n - 2,dic);
dic[n] = res
return res
}
const start = Date.now();
fibonacci(22);
console.log(Date.now() - start);
比较两个版本,似乎使用记忆化的版本在理论上应该更快的时候更慢。为什么会这样?
没有记忆:
function fibonacci(n) {
if (n <= 1) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
const start = Date.now();
fibonacci(22);
const duration = Date.now() - start;
console.log(duration);
输出:11
有记忆功能:
function fibonacci(n, dic = {}) {
if (n <= 1) {
return 1;
}
if (dic[n]) {
return dic[n];
}
let res = fibonacci(n - 1) + fibonacci(n - 2);
dic[n] = res
return res
}
const start = Date.now();
fibonacci(22);
console.log(Date.now() - start);
输出:19
在您的记忆版本中,您忘记将 dic
传递到递归调用堆栈。所以它每次都会得到默认值。
当你通过它时,时间在我的机器上降为零(这种测量性能的方法不是特别准确 - 显然它不是零!)
function fibonacci(n, dic = {}) {
if (n <= 1) {
return 1;
}
if (dic[n]) {
return dic[n];
}
let res = fibonacci(n - 1,dic) + fibonacci(n - 2,dic);
dic[n] = res
return res
}
const start = Date.now();
fibonacci(22);
console.log(Date.now() - start);