有人可以解释一下这个程序吗?我特别想知道参数如何传递给函数tower
以及递归如何工作。
以下是代码:
#include<stdio.h>
#include<conio.h>
void main()
{
int n;
clrscr();
printf("Enter the no. of disks");
scanf("%d",&n);
tower(n,'S','D','T');
getch();
}
tower(int n,char SOURCE,char DEST,char TEMP)
{
if(n>0)
{
tower(n-1,SOURCE,TEMP,DEST);
printf("\nMove disk %d from %c to %c",n,SOURCE,DEST);
tower(n-1,TEMP,DEST,SOURCE);
}
return;
}
答案 0 :(得分:4)
嗯,最好的解释方法是首先解释一下你在现实生活中的表现:移动N个磁盘,
代码模仿了这一点。唯一要理解的是,源塔,目的地和临时的“角色”对于子塔而言是不同的。
source2 = source
,dest2 = temp
,因此temp2 = dest
。source3 = source
,dest3 = dest
,temp3 = temp
source4 = temp
,dest4 = dest
,因此temp4 = source
。答案 1 :(得分:2)
该计划说明了河内塔问题的解决方案。
所以你有1个堆有n个磁盘和2个其他空堆2和3.你需要将n个磁盘从堆1移动到堆3(或1到2,这没关系)。
如果您将n个磁盘设想为(n-1个磁盘)和1个磁盘,问题就变得很简单:将(n-1)移动到堆2,将最后一个磁盘移动到堆3。
所以现在你需要弄清楚如何将(n-1)个磁盘从堆1移动到堆2,这意味着你有n-1个磁盘的确切问题。重复这个过程,最终你只需要将1个磁盘从堆1移动到堆2。