递归实现阶乘时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
再给你解释下修正的关键点:
- 把所有逻辑都放进函数的大括号内,确保
key、memo等变量能被正确访问 - 递归调用时加上
return,这样每次递归的结果会逐层传递回来,最终返回给初始调用 - 用
else替代第二个if,让逻辑更清晰,避免重复判断 - 确保当
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
相关产品推荐
相关产品推荐

