JavaScript实现汉诺塔算法时输出末尾多出undefined的问题
问题根因
末尾额外输出的undefined来自最外层的console.log(hanoi_steps(2))调用。
JavaScript中,没有显式写return返回值的函数,执行完成后会默认返回undefined。你的hanoi_steps函数内部只是调用了move方法打印步骤,本身没有返回任何值,你把它的调用结果传给console.log,自然会把默认返回的undefined打印出来。
你提到同逻辑Ruby代码运行无问题,是因为Ruby无返回值的方法默认返回nil,且你写的Ruby版本大概率没有把方法调用嵌套在输出方法里执行,自然不会打印出nil值。
修复方案
二选一即可:
- 方案1:去掉包裹
hanoi_steps调用的console.log,直接执行函数即可。因为移动步骤已经在move函数内部通过console.log逐行打印,不需要再额外打印函数返回值。
修正后完整代码:
运行输出:const hanoi_steps = (numberOfDiscs) => { move(numberOfDiscs, 1, 2 , 3); } const move = ( numberOfDiscs,start, intermediate, goal) => { if (numberOfDiscs <= 0) { return; } move(numberOfDiscs - 1, start, goal, intermediate) console.log(`${start}->${goal}`) move(numberOfDiscs - 1, intermediate, start, goal) } // 直接调用函数,不嵌套console.log hanoi_steps(2);1->2 1->3 2->3 - 方案2:如果希望所有步骤由
hanoi_steps统一返回后再打印,就不要在move函数内直接输出日志,改为把步骤收集到数组中,最后拼接成字符串返回:
该写法运行结果和预期完全一致,不会出现多余的undefined。const hanoi_steps = (numberOfDiscs) => { const steps = []; const move = (numberOfDiscs, start, intermediate, goal) => { if (numberOfDiscs <= 0) return; move(numberOfDiscs - 1, start, goal, intermediate); steps.push(`${start}->${goal}`); move(numberOfDiscs - 1, intermediate, start, goal); } move(numberOfDiscs, 1, 2, 3); return steps.join('\n'); } console.log(hanoi_steps(2));
内容的提问来源于stack exchange,提问作者Terbeche Mostefa
相关产品推荐
相关产品推荐

