c++ - 如何理解程序需要哪个递归函数
问题描述
我正在测试一些与递归函数相关的代码。我看到了河内塔问题的递归方法,但我很困惑,两个递归函数在 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");
}
解决方案
我刚读了你的问题。也许你应该知道这一点。河内塔要遵循的一些规则是 - 在任何给定时间,只能在塔之间移动一个磁盘。只能移除“顶部”磁盘。没有大磁盘可以坐在小磁盘上。所以我们需要将前 n-1 个磁盘从 x 移动到 z,然后我们可以将第 n 个磁盘从 x 移动到 y。最后将顶部的 n-1 个磁盘从 z 移动到 y。
推荐阅读
- django - Django Auth - 取消哈希密码
- angular - 如何在 Typescript 的 appconstants 中存储验证规则
- android - Flutter:让 iFame 在 Android 设备上全屏显示
- python - 在运行 Node.js 运行时(甚至自定义运行时)的 gcloud App Engine 中安装 numpy。在本地运行良好,但在部署时出现错误
- javascript - 更改范围滑块的颜色
- node.js - 如何从firebase存储中获取文件路径并使用云功能从路径重新上传回来?
- amazon-web-services - 通过 Cognito 进行身份验证的用户的 Amazon S3 特定文件夹,为 listObjects 返回 403
- jenkins - 如何通过上游作业打印下游作业中的参数?
- angular - 多个组件将节点与标记名 app-lobby 匹配
- android - 我可以在 Android XML 布局中创建可重用组件吗?