【问题标题】:I'm trying to make a function that returns the Nth Fibonacci number with recursion & memoization. I can't understand why it keeps outputing a function我正在尝试创建一个函数,该函数通过递归和记忆化返回第 N 个斐波那契数。我不明白为什么它一直输出一个函数
【发布时间】:2022-01-04 18:36:25
【问题描述】:

我很难理解为什么我的函数不断输出函数定义。我试图在不创建内部函数的情况下使用记忆和递归来解决它,但是没有内部函数来分离货币化对象,我的内部对象只是不断重置为一个空对象。这是代码...

function fib(n) {
    // create a memoization object
  let memo = {};
  // base case 1: if n=0, return 0
  if (n===0) return 0;
  // base case 2: if n=1, return 1
  if (n===1) return 1;
  // base case 3: if there is a property on the memo object for n, return that property value
  if(memo[n]) return memo[n];
  // recursive case: memo[n] = fib(n-1) + fib(n-2)
  memo[n] = fib(n-1) + fib(n-2);
  // return memo[n]
   return memo[n];
 }

这里的函数有效,但没有使用货币化对象。所以我尝试创建一个内部函数来创建一个闭包......

function fib() {
    // create a memoization object
  let memo = {};
  // create an inner function
  function inner(n) {
    // base case 1: if n=0, return 0
    if (n===0) return 0;
    // base case 2: if n=1, return 1
    if (n===1) return 1;
    // base case 3: if there is a property on the memo object for n, return that property value
    if(memo[n]) return memo[n];
    // recursive case: memo[n] = fib(n-1) + fib(n-2)
    memo[n] = fib(n-1) + fib(n-2);
    // return memo[n]
    return memo[n];
  }
  // return the inner function
  return inner;
}

// To check if you've completed the challenge, uncomment this code!
let innerFib = fib()
console.log(innerFib(1)); // -> 1
console.log(innerFib(2)); // -> 1
console.log(innerFib(7)); // -> 13

由于某种原因,第一个测试用例输出 '1',但所有其他测试用例都像这样输出实际的函数定义...

1
'function inner(n) { // base case 1: if n=0, return 0 if (n===0) return 0; // base case 2: if n=1, return 1 if (n===1) return 1; // base case 3: if there is a property on the memo object for n, return that property value if(memo[n]) return memo[n]; // recursive case: memo[n] = fib(n-1) + fib(n-2) memo[n] = fib(n-1) + fib(n-2); // return memo[n] return memo[n]; }function inner(n) { // base case 1: if n=0, return 0 if (n===0) return 0; // base case 2: if n=1, return 1 if (n===1) return 1; // base case 3: if there is a property on the memo object for n, return that property value if(memo[n]) return memo[n]; // recursive case: memo[n] = fib(n-1) + fib(n-2) memo[n] = fib(n-1) + fib(n-2); // return memo[n] return memo[n]; }'
'function inner(n) { // base case 1: if n=0, return 0 if (n===0) return 0; // base case 2: if n=1, return 1 if (n===1) return 1; // base case 3: if there is a property on the memo object for n, return that property value if(memo[n]) return memo[n]; // recursive case: memo[n] = fib(n-1) + fib(n-2) memo[n] = fib(n-1) + fib(n-2); // return memo[n] return memo[n]; }function inner(n) { // base case 1: if n=0, return 0 if (n===0) return 0; // base case 2: if n=1, return 1 if (n===1) return 1; // base case 3: if there is a property on the memo object for n, return that property value if(memo[n]) return memo[n]; // recursive case: memo[n] = fib(n-1) + fib(n-2) memo[n] = fib(n-1) + fib(n-2); // return memo[n] return memo[n]; }'

我有一种感觉,我可能只是错误地调用了函数并对其进行标记并尝试使用柯里化(如果这是正确的术语...)

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript recursion fibonacci memoization


    【解决方案1】:

    你有:

    memo[n] = fib(n-1) + fib(n-2);
    

    应该是

    memo[n] = inner(n-1) + inner(n-2);
    

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 2015-12-04
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2012-10-12
      相关资源
      最近更新 更多