汉诺塔问题:
有3根棒分别为a,b,c。 a棒上叠放n个大小不等的盘子,依次叠放为大盘在下,小盘在上。要求把这n个盘移动到c棒上,在移动过程中可以借助b棒,每次只能移动一个盘,并且在移动过程中必须始终保持3根棒上的大盘在下,小盘在上。编写程序,并且打印出移动盘子的步骤。
图:
看似很难,实则并不简单;
把A当作源柱子,B当作辅助柱子,C当作目标柱子;
但是,我们可以从简单的开始分析;
n=1时;
只需要A–>C一步完成;
当n>1时,我们先看最大的圆盘,如果这个最大的圆盘要从A移到C,那么前提是它上面没有任何圆盘,这样一来,其他圆盘就一定在B上;那么如何实现B上出现其余的n-1个圆盘呢?其实就是将n-1个圆盘从A移动到B,而这个问题,正好和我们正在编写的函数要解决的问题是同一个问题,所以直接递归调用,至此我们实现了逻辑闭环。
这之后,我们就能开始写代码了;
函数参数:
int n: 需要移动的盘子数量。char a: 起始柱子。char b: 辅助柱子。char c: 目标柱子。
递归逻辑:
-
基本情况 (
if (n == 1)):- 如果只有一个盘子,直接将它从起始柱子
a移动到目标柱子c。调用move(a, c)。
- 如果只有一个盘子,直接将它从起始柱子
-
递归情况 (
else):- 如果有多个盘子,需要分三步完成:
- 先将
n-1个盘子从起始柱子a移动到辅助柱子b,使用目标柱子c作为辅助。调用hanoit(n - 1, a, c, b)。 - 将剩下的一个盘子从起始柱子
a移动到目标柱子c。调用move(a, c)。 - 再将
n-1个盘子从辅助柱子b移动到目标柱子c,使用起始柱子a作为辅助。调用hanoit(n - 1, b, a, c)。
- 先将
- 如果有多个盘子,需要分三步完成:
#include<stdio.h>
//定义函数,打印,使步骤具象化,例如A-->B
void move(char from,char to)
{
printf("%c-->%c\n",from,to);
}
//关键的汉诺塔函数,使用递归
void hanoit(int n,char a,char b,char c)//n表示盘子的个数,a,b,c分别表示三根柱子的代号
{
if(n==1) move(a,c);//最后一步,即上面讨论的 n = 1 的情况
else {
hanoit(n-1,a,c,b);//先移动 n-1 个圆盘,但是不移动到目标柱,所以我们要从源柱子 a 移动到辅助柱子 b,使用目标柱子 c 作为辅助。
move(a,c);//具象化
hanoit(n-1,b,a,c);//然后将 n-1 个圆盘从辅助柱子 b 移动到目标柱子 c,使用源柱子 a 作为辅助。
}
}
//主函数
int main()
{
int

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



