C语言:汉诺塔问题(Hanoi Tower)------递归算法
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。
(忍不住调侃一下,难怪印度神片能这么有“内味”)
#######最后会附上源代码#######
先声明一下,我们之间约定三根柱子分别为:X Y Z,
先来一个快餐规律:
刚开始在XY柱上 现在只有X柱有盘子
X柱上 除了最底下的盘子, 都移动到Y柱, 然后就可以让最底层的盘子安心移动到Z柱
(在XY柱上 现在只有Y柱上有盘子)
Y柱上 除了最底层的盘子, 都移动到X柱,然后就可以让最底层的盘子安心移动到Z柱
(在XY柱上 现在只有X 柱上有盘子)
嗨害,你看,在XY柱上 现在只有X柱上有盘子,回到了我们刚开始的那一步
并且我们每一次移动都保证最底下的,也就是保持着大的盘子在下面,小的在上面
那么现在来认真讲解一下细节,复杂的程序,让我们化繁为简,从三个盘子开始做起! 请认真看完。
1
2
3
X Y Z
首先你先从最简单的三个盘子开始移动,我们读完题目肯定都知道,
第一步:把除了最底层的盘子,X柱上的盘子都移动到Y上面,以便于X底层的盘子移动到Z上
肯定是先把X柱子最上面那个盘子移动到Z上,
2
3 1
X Y Z
然后把第二个盘子移动到Y上
3 2 1
X Y Z
然后第一个盘子已经在Z上了,现在把他移动到Y上面,也就是第二个盘子上面
1
3 2
X Y Z
然后现在可以直接把X上最大的盘子3,移动到Z上面
1
2 3
X Y Z
第二步:把除了最底层的盘子,Y柱上的盘子都移动到X上面,以便于Y底层的盘子移动到Z上
现在把1号盘子移动到X上
1 2 3
X Y Z
然后最Y底层的就是2号盘子,移动到Z上
2
1 3
X Y Z
最后那肯定是把X上面那个小兔崽1号盘子移动到Z上了,
1
2
3
X Y Z
完成任务~
相信理解了上面之后你们就会编码了,我这个仅供参考:
#include<stdio.h>
void hanoi(int, char, char, char); //打印出移动步骤
int main()
{
//汉诺塔游戏
int n;
printf("请输入你要移动多少个汉诺塔:");
scanf("%d", &n);
printf("你需要按照下面步骤来移动:\n");
hanoi(n, 'X', 'Y', 'Z');
return 0;
}
void hanoi(int n, char x, char y, char z)
{
if(n == 1)//递归结束条件,每个递归都要有这个结束条件,看程序要求而定条件内容
{
printf("%c--->%c\n", x, z);
//n等于一的时候就是移动到最后那一步了,也就是递归的结束条件
}
else
{
hanoi(n-1, x, z, y);//除了底层的盘子 把X上的全部移动到Y, 所以是n-1
printf("%c--->%c\n", x, z);
hanoi(n-1, y, x, z);//除了底层的盘子 把Y上的全部移动到Z, 所以是n-1
}
}
本文来自博客园,作者:竹等寒,转载请注明原文链接。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战