如何理解哪个递归函数程序需要

how to understand which recursive function program needs

我正在测试一些与递归函数相关的代码。我看到了汉诺塔问题的递归方法,但我很困惑,在 if 条件下使用了两个递归函数。到目前为止对程序的理解是首先将 n 设置为零,之后我不知道它如何增加 n 以及它如何知道应该首先调用哪个递归函数。我对递归函数的理解很薄弱,请帮助我理解给定程序的递归函数的工作方式。

// 河内递归塔

#include <iostream>

using namespace std;

void towersOfHanoi(int n, int x, int y, int z)
{// Move the top n disks from tower x to tower y.
 // Use tower z for intermediate storage.
    if (n > 0) // Base Case
    {
        towersOfHanoi(n - 1, x, z, y);
        cout << "Move top disk from tower " << x << " to top of tower " << y << endl;
        towersOfHanoi(n - 1, z, y, x);

    }

} // Recursive Procedure

void main(void)
{
    cout << "Moves for a three disk problem are" << endl;
    towersOfHanoi(3, 1, 2, 3);
    system("pause");
}

我刚刚看了你的问题。也许你应该知道这一点。 河内塔要遵循的一些规则是 - 在任何给定时间只能在塔之间移动一个磁盘。 只能删除 "top" 磁盘。 没有大磁盘可以位于小磁盘之上。 所以我们需要把最上面的n-1个盘子从x移动到z,然后我们才能把第n个盘子从x移动到y。最后将前 n-1 个磁盘从 z 移动到 y。

你的理解是错误的。

它首先将n设置为零。实际上它首先将 n 设置为 3

towersOfHanoi(3, 1, 2, 3); - 这会将 n 设置为 3(第一个参数)

不知道怎么涨的n。实际上它减少了 n,

towersOfHanoi(n - 1, z, y, x); - 这会将 n 设置为 n - 1(又是第一个参数)。

它怎么知道应该先调用哪个递归函数?。它首先调用第一个,与任何其他代码相同。

    towersOfHanoi(n - 1, x, z, y); // THIS ONE FIRST
    cout << "Move top disk from tower " << x << " to top of tower " << y << endl;
    towersOfHanoi(n - 1, z, y, x); // THIS ONE SECOND

递归函数的工作方式完全与任何其他函数相同。没有魔法。