任何人都可以追踪这个程序,以帮助我更好地掌握递归的工作原理

问题描述 投票:-2回答:1

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

一次只能移动一个磁盘。每次移动包括从其中一个堆叠中取出上部磁盘并将其放置在另一个堆叠的顶部或空杆上。没有更大的磁盘可以放在较小的磁盘上。有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;
}`
c++ recursion
1个回答
2
投票

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

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

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

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:%d\n", __FUNCTION__, __FILE__, __LINE__ );
© www.soinside.com 2019 - 2024. All rights reserved.