递归之---汉诺塔

来源:互联网 发布:淘宝兄弟体育是正品么 编辑:程序博客网 时间:2024/06/05 10:11

递归思想的概念:即将一个复杂问题分解成一系列小的问题,并且这些小问题都具有相同的情形。
此时可运用递归的思想来解决更易于理解(但并不一定是效率最高的哦);
递归算法有三个关键点:
(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);}


 

0 0
原创粉丝点击