【C语言】汉诺塔问题(递归)

【C语言】汉诺塔问题(递归),第1张


一、汉诺塔问题

假设有a、b、c三根柱子,a柱子上从上到下、从小到大有n个圆盘,每次只能移动一个圆盘,移动过程中a、b、c三根柱子上都可以放圆盘,且必须是大盘在下、小盘在上,最终按照原有顺序将圆盘全部移动到c柱子上。



二、分析

假设有1个圆盘,如图所示,那么直接将圆盘移动到c柱子上即可。


假设有2个圆盘,如图所示,那么圆盘移动过程应是:a-->b,a-->c,b-->c。


假设有3个圆盘,如图所示,那么圆盘移动过程应是:a-->c,a-->b,c-->b,a-->c,b-->a,b-->c,a-->c。


假设有4个圆盘,如图所示,那么圆盘移动过程应是:a-->b,a-->c,b-->c,a-->b,c-->a,c-->b,a-->b,a-->c,b-->c,b-->a,c-->a,b-->c,a-->b,a-->c,b-->c。


 可以发现,当有n个圆盘时,可以先借助c柱子把较小的n-1个圆盘全都移动到b柱子上,再把a柱子上剩下的最大的一个圆盘移动到c柱子上。


这时候b柱子上有n-1个圆盘,需要再借助a柱子把剩下的n-1个圆盘移动到c柱子上,其实就相当于a柱子上有n-1个圆盘的情况。


这样就可以用递归的方法来求解。



三、程序实现

#include 

int count=0;

void Hanoi(int x,char a,char b,char c)
{
	count++;
    if(x==1)
		printf("%c-->%c\n",a,c);
	else
	{
	    Hanoi(--x,a,c,b);
		printf("%c-->%c\n",a,c);
		Hanoi(x,b,a,c);
	}
}

int main()
{
	char a='a';
	char b='b';
	char c='c';
    int num=0;
	printf("请输入圆盘数:");
	scanf("%d",&num);
	printf("步骤如下:\n");
	Hanoi(num,a,b,c);
	printf("共需移动%d步\n",count);
	return 0;
}


四、结果

 通过结果还可以看出,移动步数其实就是2^n-1。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/577952.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存