You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归实现阶乘时return语句触发未定义错误的问题咨询

递归实现阶乘时return语句触发未定义错误的问题咨询

我来帮你分析下问题所在,首先看你写的代码,有个非常关键的语法错误,直接导致了后续的所有问题:

你定义factorial函数时,函数体的大括号{}在const key = x ;之后就直接闭合了!这意味着后面的console.log(key);、if判断、递归调用这些代码全都不在函数内部,而是全局代码。这就解释了为什么你说“inside if, the key does not exists”——因为key是函数内部的变量,全局代码里根本访问不到它,自然会报undefined错误!

咱们来一步步梳理你的代码问题:

  • 函数体范围错误:大括号位置错误,导致核心逻辑都在函数外,无法访问函数内的key、memo等变量
  • 递归逻辑的问题:你的递归调用没有处理返回值,就算函数体正确了,最终也无法把计算结果传递回来
  • 边界条件的处理:当前的逻辑中,当key不等于0或1时,直接用memo[key-1]*key,但如果memo[key-1]还没被计算出来(比如第一次调用时),会得到NaN

接下来是修正后的代码,我会保留你的“从0开始递归到n”的思路,同时修复所有问题:

const factorial = (x = 0, n = 0, memo = {}) => {
  const key = x;
  console.log(key);
  console.log(n);

  // 处理边界条件,先给memo赋值
  if (key === 0 || key === 1) {
    memo[key] = 1;
  } else {
    // 这里确保memo[key-1]已经存在(因为我们是从0往上递推的)
    memo[key] = memo[key - 1] * key;
  }

  // 递归终止条件:当当前key等于目标n时,返回结果
  if (key === n) {
    return memo[n];
  }

  // 递归调用下一个数,并且要return这个调用的结果,否则结果无法传递回去
  return factorial(key + 1, n, memo);
};

console.log(factorial(0, 3)); // 输出6

再给你解释下修正的关键点:

  1. 把所有逻辑都放进函数的大括号内,确保key、memo等变量能被正确访问
  2. 递归调用时加上return,这样每次递归的结果会逐层传递回来,最终返回给初始调用
  3. 用else替代第二个if,让逻辑更清晰,避免重复判断
  4. 确保当key大于1时,memo[key-1]已经被计算过(因为我们从0开始递增,所以每次递归都会先计算前一个数的结果)

另外,你之前测试的if(1==1 ) return memo[key];或者if(key==key) return memo[n];报错,本质还是因为这些代码在函数外面,根本访问不到key和memo变量,所以才会报undefined。

备注:内容来源于stack exchange,提问作者Kanal Muhtekir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:44:52