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