您的位置:首页 > 其它

递归之---汉诺塔

2015-12-26 21:56 253 查看
递归思想的概念:即将一个复杂问题分解成一系列小的问题,并且这些小问题都具有相同的情形。

此时可运用递归的思想来解决更易于理解(但并不一定是效率最高的哦);

递归算法有三个关键点:

(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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: