09 python汉诺塔

# -*- coding: utf-8 -*-
# @Time : 2025/4/4 16:15
# @Author : write1994
# @File : lear_Hanoi.py
# @Desc : 汉诺塔

'''
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵
天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序
摞着 64 片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放
在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只
能移 动一个圆盘

'''


def hanoi(n, a, b, c):
    '''汉诺塔问题'''
    if n == 1:
        print(a, '-->', c)
    else:
        hanoi(n - 1, a, c, b)
        print(a, '-->', c)
        hanoi(n - 1, b, a, c)


c = hanoi(5, 'A', 'B', 'C')


def hanoi(n, source, auxiliary, target):
    if n == 1:
        # 当只有一个圆盘时,直接从源柱子移动到目标柱子
        print(f"Move disk 1 from {source} to {target}")
        return
    # 把 n-1 个圆盘从源柱子借助目标柱子移动到辅助柱子
    hanoi(n - 1, source, target, auxiliary)
    # 把第 n 个圆盘从源柱子移动到目标柱子
    print(f"Move disk {n} from {source} to {target}")
    # 把 n-1 个圆盘从辅助柱子借助源柱子移动到目标柱子
    hanoi(n - 1, auxiliary, source, target)


# 测试汉诺塔函数,假设有 3 个圆盘
n = 5
hanoi(n, 'A', 'B', 'C')

### Python 实现汉诺塔问题的递归方法 以下是基于递归实现的经典汉诺塔算法示例: #### 汉诺塔递归逻辑说明 汉诺塔的核心思想是利用递归来解决复杂的问题。对于 n 个盘子的情况,可以将其分解为以下三个步骤: 1. 将前 \(n-1\) 个盘子从源柱 A 移动到辅助柱 B 上。 2. 将第 n 个盘子从源柱 A 移动到目标柱 C 上。 3. 再将 \(n-1\) 个盘子从辅助柱 B 移动到目标柱 C 上。 这种分而治之的思想可以通过递归函数轻松实现[^1]。 #### Python 代码实现 下面是一个完整的 Python 程序来演示汉诺塔的递归解决方案: ```python def hanoi_tower(n, source, auxiliary, target): """ 使用递归实现汉诺塔问题 参数: n (int): 盘子的数量 source (str): 起始柱名称 auxiliary (str): 辅助柱名称 target (str): 目标柱名称 """ if n == 1: print(f"Move disk 1 from {source} to {target}") return # 将前 n-1 个盘子从 source 移动到 auxiliary hanoi_tower(n - 1, source, target, auxiliary) # 将第 n 个盘子从 source 移动到 target print(f"Move disk {n} from {source} to {target}") # 将 n-1 个盘子从 auxiliary 移动到 target hanoi_tower(n - 1, auxiliary, source, target) # 测试程序 if __name__ == "__main__": number_of_disks = 3 # 可更改此值测试不同数量的盘子 hanoi_tower(number_of_disks, 'A', 'B', 'C') ``` 上述代码定义了一个 `hanoi_tower` 函数,该函数接收四个参数:盘子数量 (`n`) 和三根柱子的名字(分别表示起始柱、辅助柱和目标柱)。当盘子数为 1 时,直接打印移动操作;否则按照递归逻辑逐步完成任务[^4]。 #### 输出示例 假设我们设置 `number_of_disks=3` 并运行以上脚本,则会得到如下输出: ``` Move disk 1 from A to C Move disk 2 from A to B Move disk 1 from C to B Move disk 3 from A to C Move disk 1 from B to A Move disk 2 from B to C Move disk 1 from A to C ``` 这表明所有的盘子都已成功地按规则从柱子 A 移到了柱子 C[^5]。 --- ### 非递归实现简介 虽然递归是最常见的汉诺塔实现方式,但也存在一种非递归的方法,它依赖于显式的栈结构模拟递归调用的过程。这种方法通常更难理解但有助于优化性能,在某些场景下可能更加适用[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值