Python小程序分享04——汉诺塔(递归)

本文介绍了一个经典的递归问题——汉诺塔游戏,并提供了实现该算法的Python代码。通过实例演示了不同层数的汉诺塔游戏的解决步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.汉诺塔游戏

这里写图片描述

1.简单递归代码分享

# -*- coding: utf-8 -*-
# hanoi.py
"""
Created on Tue Apr 20 21:16:08 2018
@author: wangdan
learned from www.fishc.com
"""
def hanoi(n, x, y, z):
    if n == 1:
        print(x, '--->', z) # 如果只有一层,直接从x移动到z
    else:
        hanoi(n-1, x, z, y) # 将前n-1个盘子从x移动到y上
        print(x, '--->', z) # 将最底下的盘子从x移动到z上
        hanoi(n-1, y, x, z) # 将y上的盘子移动到z上

n = int(input("请输入汉诺塔的层数:"))
print("盘子搬运过程如下:")
hanoi(n, 'A', 'B', 'C')

2.程序运行测试

  • 当汉诺塔只有两个盘子时:
>>>请输入汉诺塔的层数:2
盘子搬运过程如下:
A ---> B
A ---> C
B ---> C
  • 当汉诺塔有五个盘子时:
>>>请输入汉诺塔的层数:5
盘子搬运过程如下:
A ---> C
A ---> B
C ---> B
A ---> C
B ---> A
B ---> C
A ---> C
A ---> B
C ---> B
C ---> A
B ---> A
C ---> B
A ---> C
A ---> B
C ---> B
A ---> C
B ---> A
B ---> C
A ---> C
B ---> A
C ---> B
C ---> A
B ---> A
B ---> C
A ---> C
A ---> B
C ---> B
A ---> C
B ---> A
B ---> C
A ---> C
### 汉诺塔递归算法实现 汉诺塔问题是一个经典的递归问题,其核心在于通过分解问题来逐步解决问题。以下是基于C++和Python两种编程语言的汉诺塔递归算法实现。 #### C++ 实现 在C++中,可以通过定义一个`hanio`函数来实现汉诺塔问题的递归解决方案: ```cpp #include <iostream> using namespace std; void hanio(int n, char A, char B, char C) { if (n == 1) { cout << "Put " << n << " from " << A << " to " << B << endl; } else { hanio(n - 1, A, C, B); // 将前n-1个盘子从A借助C移动到B cout << "Put " << n << " from " << A << " to " << B << endl; // 移动第n个盘子 hanio(n - 1, C, B, A); // 将剩余的n-1个盘子从C借助A移动到B } } int main() { int num = 0; cout << "Please input the number of disks:" << endl; cin >> num; hanio(num, 'A', 'B', 'C'); system("pause"); return 0; } ``` 上述代码展示了如何利用递归来解决汉诺塔问题[^3]。程序的核心逻辑是将较大的问题拆分为较小的问题,并逐层处理直到最简单的情况(即只有一个盘子时的操作)。 #### Python 实现 同样,在Python中也可以优雅地实现汉诺塔递归算法: ```python def hanoi(n, source, auxiliary, target): if n == 1: print(f"Move disk 1 from {source} to {target}") else: hanoi(n - 1, source, target, auxiliary) # 将前n-1个盘子从源柱借助辅助柱移动到中间柱 print(f"Move disk {n} from {source} to {target}") # 移动第n个盘子 hanoi(n - 1, auxiliary, source, target) # 将剩余的n-1个盘子从中间接力柱借助源柱移动到目标柱 if __name__ == "__main__": num_disks = int(input("Enter the number of disks: ")) hanoi(num_disks, 'A', 'B', 'C') ``` 这段代码清晰地体现了递归的思想,其中每次调用都会进一步缩小问题规模直至达到基本情况[^4]。 #### 关键点分析 1. **递归终止条件**:当盘子数量为1时,直接将其从起始位置移动到目标位置。 2. **递归过程**:对于超过一个盘子的情况,先将顶部的\(n-1\)个盘子移动到辅助柱上;接着把当前最大的盘子放到目标柱上;最后再把之前放在辅助柱上的\(n-1\)个盘子转移到目标柱上。 3. **参数传递**:每一次递归调用都需要重新指定三个柱子的角色——起点、终点以及过渡使用的辅助柱。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值