如何理解哪个递归函数程序需要
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
递归函数的工作方式完全与任何其他函数相同。没有魔法。
我正在测试一些与递归函数相关的代码。我看到了汉诺塔问题的递归方法,但我很困惑,在 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
递归函数的工作方式完全与任何其他函数相同。没有魔法。