第12周 oj 汉诺塔问题

本文介绍了一个经典的递归问题——汉诺塔,并提供了详细的递归算法实现过程。通过对汉诺塔问题背景的描述,逐步引导读者理解递归算法的设计思路,并通过具体的C语言代码展示了如何实现该算法。

问题及代码:

/*Copyright(c)2016,烟台大学计算机学院
all rights reserved.
作者:曹欣宇
完成日期:2016年11月18日
题目描述
汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A、B和C,A上面套着n个圆的金片,最大的一个在底下,
其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从A棒搬到C棒上,规定可利用中间的一根B棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。
僧侣们搬得汗流满面,可惜当n很大时这辈子恐怕就很搬了 聪明的你还有计算机帮你完成,你能写一个程序帮助僧侣们完成这辈子的夙愿吗?

输入
  输入金片的个数n。这里的n<=10。
输出
  输出搬动金片的全过程。格式见样例。
样例输入
  2
样例输出
 Move disk 1 from A to B
 Move disk 2 from A to C
 Move disk 1 from B to C
*/
#include<stdio.h>
void han(int n,char A,char B,char C);
int main()
{
    int n;
    scanf("%d",&n);
    han(n,'A','B','C');
    return 0;
}
void han(int n,char A,char B,char C)
{
    if (n==1)
    {
        printf("Move disk %d from %c to %c\n", n, A, C);
    }
    else
    {
        han(n-1,A,C,B);
        printf("Move disk %d from %c to %c\n", n, A, C);
        han(n-1,B,A,C);
     }
 }

运行结果:

知识点总结:

通过学习,进一步巩固了递归算法。

学习心得:

这个题我一开始不明白为什么能把每一步都能输出,因为printf只有两个,后来我才想起来是形参的原因,这个题我掌握的还不是很好,还得继续努力啊...

### 汉诺塔问题解题思路 汉诺塔问题是经典的递归算法案例。该问题的目标是在遵循特定规则的情况下,将一系列不同大小的圆盘从一根柱子移动到另一根柱子上。具体来说,每次只能移动一个圆盘,并且任何时候都不能将较大的圆盘放在较小的圆盘之上。 对于东华大学OJ中的汉诺塔问题,可以采用递归来解决这个问题[^1]。核心思想是通过递归调用来逐步减少待解决问题的规模,直到达到最简单的情况——只有一个圆盘可以直接移动。 #### 代码实现 以下是Python语言下的汉诺塔问题解决方案: ```python def hanoi(n, source, auxiliary, target): if n == 1: print(f"Move disk 1 from {source} to {target}") return # Move top n-1 disks from source to auxiliary using target as temp space hanoi(n - 1, source, target, auxiliary) # Move nth (largest) disk directly from source to target print(f"Move disk {n} from {source} to {target}") # Finally move the n-1 disks that we had placed on auxiliary to target hanoi(n - 1, auxiliary, source, target) # Example usage with three disks and poles A, B, C. hanoi(3, 'A', 'B', 'C') ``` 这段程序定义了一个名为`hanoi`的函数,它接受四个参数:要移动的圆盘数量`n`、起始柱子名`source`、辅助柱子名`auxiliary`以及目标柱子名`target`。当仅有一个圆盘时(`if n == 1`),直接打印出这一步骤;否则先利用递归处理前`(n-1)`个圆盘至辅助位置,再单独转移第`n`个最大的圆盘到最后的位置,最后再次运用递归把之前留在辅助上的剩余圆盘全部移到最终目的地。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值