递归之---汉诺塔

递归思想的概念:即将一个复杂问题分解成一系列小的问题,并且这些小问题都具有相同的情形。
此时可运用递归的思想来解决更易于理解(但并不一定是效率最高的哦);
递归算法有三个关键点:
(1)了解题意是否适用递归来解决;
(2) 有明确的终止条件(通常是分解出来的一系列小问题里最简单的那种情况);
(3) 随着递归算法的演进,数据规模在递减,决定递归执行部分;

 

设计思路:

我们可以定义出圆盘原先所在桩为“来源桩”(from),铁盘预以往"目的桩(to)",而另一个桩为“辅助桩(auxiliary)”当圆盘为三个时,

需把圆盘一移往目的桩,再把圆盘二移往辅助桩,把圆盘一移到辅助桩圆盘二上,然后把圆盘三移到目的桩。。。。。。.
以此类推,可知当未移往目的桩的圆盘数为1时,则将最后所剩的铁盘移至目的桩,即完成工作。
否则,
(1)将前N-1个圆盘从源桩移往辅助桩;
(2)将编号为N的铁盘从源桩移往目的桩;
(3)将前N-1个圆盘从辅助桩移往目的桩。

 

int step_number;
void move(char x,char y,int number)
{	
	step_number++;
	printf("The step %d:",step_number);
	printf("move disk %d from %c to %c\n",number,x,y);
}
void hanoi(int n,char from,char auxiliary,char to)
{	
	if(n==1)
		move(from,to,1);
	else{
		hanoi(n-1,from,to,auxiliary);
		move(from,to,n);
		hanoi(n-1,auxiliary,from,to);
	}
}
void main()
{
	int disk_number;
	printf("The power of Hanoi program.\n");
	printf("please enter the number of disks:");
	scanf("%d",&disk_number);
	printf("The step to moving %d diskes:\n",disk_number);
	hanoi(disk_number,'A','B','C');
	printf("step_number = %d", step_number);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值