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

如何用递归代码实现汉诺塔问题的可视化分步输出?

汉诺塔问题可视化解决方案

你的基础递归移动逻辑是成立的,核心问题是需要新增一个纯展示的可视化函数,把数字列表转换成直观的塔形,同时不干扰递归过程中的数据传递。下面是完整的可运行实现:

def visualize_towers(towers, total_disks):
    # 从塔的最上层到最下层逐行绘制
    for level in range(total_disks - 1, -1, -1):
        line_segment = ""
        for tower in towers:
            # 当前层有圆盘则绘制对应长度的符号,否则留空
            if level < len(tower):
                disk_size = tower[level]
                # 用 '-' 模拟圆盘,通过空格居中对齐,保证塔形整齐
                line_segment += f"{' '*(total_disks - disk_size)}{'-'*(2*disk_size - 1)}{' '*(total_disks - disk_size)} | "
            else:
                line_segment += f"{' '*total_disks}|{' '*total_disks} | "
        print(line_segment)
    # 绘制塔的底座
    print(f"{'='*(3*(2*total_disks + 2))}")
    # 标注柱子名称
    print(f"{' '*total_disks}A{' '*total_disks} | {' '*total_disks}B{' '*total_disks} | {' '*total_disks}C{' '*total_disks}")

def hanoi(n, source, auxiliary, target, total_disks):
    if n > 0:
        hanoi(n-1, source, target, auxiliary, total_disks)
        # 移动圆盘:从源柱顶部取出,放入目标柱顶部
        moved_disk = source.pop()
        target.append(moved_disk)
        # 打印步骤描述 + 当前状态可视化
        print(f"\n步骤:将圆盘 {moved_disk} 从 {pillar_names[source]} 移到 {pillar_names[target]}")
        visualize_towers([source, auxiliary, target], total_disks)
        hanoi(n-1, auxiliary, source, target, total_disks)

# 获取用户输入的圆盘数量
disk_count = int(input("请输入圆盘数量:"))
# 初始化三个柱子:源柱从大到小放置圆盘,辅助柱、目标柱为空
source_pillar = list(range(disk_count, 0, -1))
aux_pillar = []
target_pillar = []
# 建立柱子与名称的映射,用于步骤描述
pillar_names = {source_pillar: "A", aux_pillar: "B", target_pillar: "C"}

# 打印初始状态
print("初始状态:")
visualize_towers([source_pillar, aux_pillar, target_pillar], disk_count)
# 启动汉诺塔递归
hanoi(disk_count, source_pillar, aux_pillar, target_pillar, disk_count)

关键改进说明:

  1. 可视化函数无副作用:visualize_towers仅读取柱子的当前状态,不修改任何数据,完全不会干扰递归逻辑中的数据传递,避免了你之前遇到的"数据被覆盖"问题。
  2. 修正圆盘移动逻辑:原代码用pop(0)和insert(0)操作列表头部,不符合汉诺塔"从顶部取放圆盘"的实际逻辑,改用pop()和append()操作列表尾部,既符合物理规则,也提升了代码效率。
  3. 直观的塔形展示:通过空格居中对齐不同大小的圆盘,模拟出立体的塔状结构,和你想要的效果一致。

效果示例(3个圆盘初始状态):

-   |       |       | 
 ---  |       |       | 
----- |       |       | 
=========================
   A   |   B   |   C   

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:55:24