hanoi塔问题分析

问题描述

    这个问题起源于一个类似传说故事,在Hanoi这个地方有一个寺庙,这里有3根柱子和64个大小不同的金碟子。每个碟子有一个孔可以穿过。所有的碟子都放在第一个柱子上,而且按照从上到下碟子的大小依次增大的顺序摆设。如下图:

    现在,假定寺庙里的僧侣要移动这些碟子,将它们从最左边移动到最右边的柱子上。不过移动的规则如下:

1. 每次只能从一个柱子的最上面移动一个碟子到另外一个柱子上。

2. 不能将大碟子放到小碟子的上面。

    按照前面这个规则,我们该怎么去移动这些碟子呢?假定单位时间内可以移动一片碟子,那么最终移动这些碟子到目的柱子需要多长的时间呢?(古老的直着们说等64个大小不同的金碟子全部移动完毕,那么世界末日也就到了)


总结

      Hanoi塔问题是一个经典的递归循环问题,其本身的复杂度达到了指数函数级别。所以使得运算时间的增长非常快。通过一种递归的思路,首先我们可以总结出一个问题的递归描述方式。然后我们再通过不断的代入和分析,去发现形成等式的规律。这是一种发现递归问题等式描述的方法。为了保证方法最终的正确性,我们还需要经常使用数学归纳法来证明这个等式的正确性。 

代码如下:

#include <stdio.h>  
int i=1; 
void move(int n,char x,char z)   
{
	printf("第%d步:将%d号盘子%c---->%c\n",i++,n,x,z);  
}  
void hanoi(int n,char x,char y,char z)
{  
    if (n==1)  
    move(1,x,z);
    else  
    {  
      hanoi(n-1,x,z,y);
      move(n,x,z);             
      hanoi(n-1,y,x,z);
    }  
}  
int main()  
{  
	while(true)
		{
			printf("请输入盘子的个数:");  
		     int n;  
		     scanf("%d",&n);  
		     char x='A',y='B',z='C';  
		     printf("盘子移动情况如下:\n");  
		     hanoi(n,x,y,z); 
		}
	return 0;
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值