JavaScript递归返回undefined问题:数字反转场景排查
递归反转数字返回undefined的问题解决办法
嘿,我瞅见你遇到的问题了——明明递归终止条件里的console.log显示结果是对的,但最终调用函数却返回undefined,这事儿确实挺挠头的,咱们来拆解下问题出在哪。
先贴出你的原代码方便分析:
// reverse the number var result= ""; var reverse = function(x) { if(x == 0){ console.log("result",result); return result; }else{ var lastDigit = x % 10; result += lastDigit; x = Math.floor(x/10); reverse(x); // 这里藏着核心问题! } }; console.log(reverse(73254));
问题根源
你在else分支里调用递归函数reverse(x)的时候,没有把这个递归调用的返回值传递回去。简单说就是:只有最底层的递归(当x==0时)返回了正确的result,但上层的递归函数都没把这个结果往上抛,导致顶层调用最终拿到的就是undefined。
另外还有个小隐患:result是全局变量,多次调用reverse会导致结果叠加(比如第一次调用reverse(73254)得到"45237",第二次调用reverse(123)会得到"45237321"),最好把它改成递归内部维护的变量。
修复方案
方案1:先解决核心return问题(保留全局变量,不推荐但快速生效)
只需要在else分支的递归调用前加个return,把递归结果传递回去:
var result= ""; var reverse = function(x) { if(x == 0){ console.log("result",result); return result; }else{ var lastDigit = x % 10; result += lastDigit; x = Math.floor(x/10); return reverse(x); // 加上return,把递归结果往上传 } }; console.log(reverse(73254)); // 现在会输出"45237"
方案2:去掉全局变量,用递归参数维护结果(推荐,更符合纯函数特性)
把result改成递归函数的可选参数,避免全局污染,多次调用也不会出问题:
var reverse = function(x, result = "") { if(x == 0){ return result; }else{ var lastDigit = x % 10; result += lastDigit; x = Math.floor(x/10); return reverse(x, result); // 把当前结果传递到下一层递归 } }; console.log(reverse(73254)); // 输出"45237" console.log(reverse(123)); // 输出"321",多次调用无干扰
如果需要返回数字类型,只需要把return result改成return Number(result)就行。
内容的提问来源于stack exchange,提问作者SPGuar
相关产品推荐
相关产品推荐

