理解递归函数时遇到问题

时间:2016-06-14 10:43:52

标签: c recursion

我仍然是一个相对较新的程序员,试图掌握递归。我查看了各种在线教程,了解它们的工作方式,并使它们看起来很容易理解。但是当我偶然发现这个问题时,我试图跟踪程序的运行方式很麻烦。

#include <stdlib.h>
#include <stdio.h>

void hanoi(int n);

int main (int argc, char *argv[]) {
    hanoi(2);
}


void hanoi( int n ) {
    printf("\n\n--------!n-------: %d\n\n", n);
    if ( n > 0 ) {
        hanoi ( n - 1 );
        printf("\n\n--------#n---------: %d\n\n", n);
        hanoi ( n - 1 );
        printf("\n\n-------$n---------: %d\n\n", n);
    }
}

输出

!n: 2

!n: 1

!n: 0

#n: 1

!n: 0

$n: 1

#n: 2

!n: 1

!n: 0

#n: 1

!n: 0

$n: 1

$n: 2

所以我希望有人可以逐步完成这个程序并帮助我理解递归是如何工作的。

编辑: - 关于照片的消息 -

1 个答案:

答案 0 :(得分:0)

您希望将n块从引脚1移动到引脚3。

你可以通过以下方式做到:

  1. 将除底部块之外的所有块移动到第2针。这需要多次移动,相当于解决n-1块的hanois塔,因此调用hanoi(n-1)

    < / LI>
  2. 将底部块移动到第3针。这是一次移动。

  3. 最后将剩余的块从引脚2移动到引脚3.这需要多次移动,相当于解决n-1块的hanois塔,因此第二次调用hanoi(n-1)