请使用F7逐步向我解释递归过程。
我无法将回报与控制流量联系起来。
#include<stdio.h>
#include<conio.h>
void t_of_h(char, char, char, int);
void main()
{
int n;
clrscr();
printf("Enter no of DISC in Tower of Hanoi : ");
scanf("%d",&n);
printf("\nTower of Hanoi using %d DISCS\n",n);
t_of_h('X', 'Y', 'Z', n);
getch();
}
void t_of_h(char p1, char p2, char p3, int n)
{
if(n==0)
printf("Unsuccessful move\n");
if(n==1)
printf("Move DISC from %c to %c\n",p1,p3);
else
{
t_of_h(p1,p3,p2,n-1);
t_of_h(p1,p2,p3,1);
t_of_h(p2,p1,p3,n-1);
}
}
答案 0 :(得分:3)
如何将N盘从A座移到B座?
代码是一个非常直接的实现。如果您认为可以将任意数量的磁盘从一个塔移动到另一个塔,那么这显然可行。如何将N-1盘从A塔移到C座?好吧,你把N-2盘从A座移到B座,然后将第N-1盘从A座移到C座,然后将N-2盘从B座移到C座。然后重复...
最终,递归停止,因为您有一个要移动的磁盘。
一个有趣的练习是“编写测试工具,确保不会进行无效移动”。
好的 - 我已经运行了代码。它对过程的可视化是可怕的。很难看出发生了什么。但它直接报告算法的作用。现在怎么样?
Enter no of DISC in Tower of Hanoi : 1
Tower of Hanoi using 1 DISCS
Move DISC from X to Z
Enter no of DISC in Tower of Hanoi : 2
Tower of Hanoi using 2 DISCS
Move DISC from X to Y
Move DISC from X to Z
Move DISC from Y to Z
请注意,它正在将磁盘从X移动到Z.如何将2个磁盘从X移动到Z?将顶部磁盘从X移动到Y.将底部磁盘从X移动到Z.将原始顶部磁盘从Y移动到Z.
Enter no of DISC in Tower of Hanoi : 3
Tower of Hanoi using 3 DISCS
Move DISC from X to Z
Move DISC from X to Y
Move DISC from Z to Y
Move DISC from X to Z
Move DISC from Y to X
Move DISC from Y to Z
Move DISC from X to Z
答案 1 :(得分:0)
使用F7?
如果您在理解递归时遇到困难,请拿出笔和纸并逐步完成该程序。使用正确的参数堆叠每个调用。
当你想象它时应该更简单。