首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >javascript函数自动回传

javascript函数自动回传
EN

Stack Overflow用户
提问于 2022-01-07 02:53:29
回答 1查看 58关注 0票数 1

我试着用javascript实现回忆录。下面是代码:

代码语言:javascript
运行
复制
function memoize(func) {
    var history = {}

    var inner = function(n) {
        if (n in history) {
            return history[n];
        }
        let result = func(n)
        history[n] = result;
        return result;
    }
    return inner;
}

function fib(n) {
    if (n <= 1) {
        return n;
    }
    return fib(n-1) + fib(n-2)
}
/*
fib = memoize(fib);
console.log(fib(20)) // O(n)
*/
/*
fib2 = memoize(fib);
console.log(fib2(20)) // O(2^n)
*/

起作用了..。我可以用O(n)来计算值,但我失去了原来的函数。有没有办法让原来的fib函数还可以访问呢?谢谢

EN

Stack Overflow用户

回答已采纳

发布于 2022-01-07 03:27:20

如果要保留fib的原始未回忆录版本,则需要以某种方式修改fib,例如将递归函数作为参数传递。否则,递归fib调用将保留为函数的非回忆录版本。

例:

代码语言:javascript
运行
复制
function memoize(func) { // potentially update this to accept as hash function to calculate the key for `history` to make this more generic
  var history = {}
  var inner = function(n, ...args) {
    if (n in history) {
      return history[n];
    }
    let result = func(n, ...args);
    history[n] = result;
    return result;
  }
  return inner;
}

function fib(n, recursiveFn = fib) {
  if (n <= 1) {
    return n;
  }
  return recursiveFn(n - 1, recursiveFn) + recursiveFn(n - 2, recursiveFn)
}

const fastFib = memoize(fib);
console.log(fastFib(40, fastFib)); // O(n)
const slowFib = fib(40); // O(2^n)
console.log(slowFib);

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70616066

复制
相关文章

相似问题

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