有人能跟踪这个程序来帮助我更好地理解递归是如何工作的吗



该程序解决了河内塔难题。这个谜题的目的是将一整堆磁盘移动到另一个棒上,遵循以下简单规则:

一次只能移动一个磁盘。每一步都包括从一个堆叠中取出上圆盘,并将其放置在另一个堆叠的顶部或空棒上。较大的磁盘不能放在较小的磁盘上。有了3个圆盘,这个谜题可以在7个动作中解决。解决河内塔谜题所需的最小移动次数为2^n-1,其中n是圆盘的数量。

#include <stdio.h>
void tower(int n, char start, char end, char help)
{
if (n == 0)
{
return;
}
tower(n - 1, start, help, end);
printf("nDisk %d has been moved from tower %c to tower %c", n, start, 
end);
tower(n - 1, help, end, start);
}
int main()
{
tower(3, 'A', 'C', 'B');
return 0;
}`

在许多环境中,通过调试器运行只是不可用。在特定的嵌入式系统中,或在发生错误之前在生产中运行N天的作业中。

在这些场景中,使用简单的printf()或更复杂的日志记录功能记录程序流可能是了解发生了什么的唯一方法之一。

与跟踪递归执行流类似,只需在函数中添加一个打印:

void tower(int n, char start, char end, char help)
{
printf("tower(n=%d, start=%c, end=%c, help=%c)n", n, start, end, help);
...

给予:

tower(n=3, start=A, end=C, help=B)
tower(n=2, start=A, end=B, help=C)
tower(n=1, start=A, end=C, help=B)
tower(n=0, start=A, end=B, help=C)
Disk 1 has been moved from tower A to tower C
tower(n=0, start=B, end=C, help=A)
Disk 2 has been moved from tower A to tower B
tower(n=1, start=C, end=B, help=A)
tower(n=0, start=C, end=A, help=B)
Disk 1 has been moved from tower C to tower B
tower(n=0, start=A, end=B, help=C)
Disk 3 has been moved from tower A to tower C
tower(n=2, start=B, end=C, help=A)
tower(n=1, start=B, end=A, help=C)
tower(n=0, start=B, end=C, help=A)
Disk 1 has been moved from tower B to tower A
tower(n=0, start=C, end=A, help=B)
Disk 2 has been moved from tower B to tower C
tower(n=1, start=A, end=C, help=B)
tower(n=0, start=A, end=B, help=C)
Disk 1 has been moved from tower A to tower C
tower(n=0, start=B, end=C, help=A)

还有方便的编译器宏__FILE____FUNCTION____LINE__(还有更多,取决于您的编译器(。可以嵌入日志/打印语句:

printf( "Something eldritch happened in %s at %s:%dn", __FUNCTION__, __FILE__, __LINE__ );

最新更新