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

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函数内直接输出日志,改为把步骤收集到数组中,最后拼接成字符串返回:
    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));
    
    该写法运行结果和预期完全一致,不会出现多余的undefined。

内容的提问来源于stack exchange,提问作者Terbeche Mostefa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:57:14