c++ - 关于这个递归函数的问题
问题描述
查找输入 n 的阶乘的代码:
#include <iostream>
using namespace std;
long long factorial(int num) {
if (num == 0) {
return 1;
}
else {
return num * factorial(num-1);
}
}
int main() {
int num;
cin >> num;
cout << factorial(num) << endl;
}
我的问题是:
这里写了 factorial(num-1) 那么变量 num 如何在每个循环中减少?该函数将永久使用 num-1 作为其参数,但不会保存 num。我的意思是应该有 num--; 在函数中。我已经尝试并在程序结束时打印出变量 num,它是相同的,num 不是 0。
这里写 if (num == 0) { return 1; } 。当 num 减少到 0 时,函数不应该将 1 作为最终值吗?但事实并非如此。就像变量一样,当你在程序末尾写 a = 1 时;那么不管a之前发生了什么计算,a的最终值都是1。据我所知return 1; 有同样的效果,不是吗?
非常感谢
解决方案
递归函数的工作方式与非递归函数完全一样——没有“循环”,也没有递减。
也许替代方法会有所帮助。
考虑factorial(2)
。
如果我们在函数体中替换num
为2
if (2 == 0) {
return 1;
}
else {
return 2 * factorial(2-1);
}
为了计算这个,我们需要factorial(1)
,它变成
if (1 == 0) {
return 1;
}
else {
return 1 * factorial(1-1);
}
现在我们需要factorial(0)
:
if (0 == 0) {
return 1;
}
else {
return 0 * factorial(0-1);
}
这很明显1
,所以现在我们可以向上移动并插入计算值来代替函数调用。
factorial(1)
:
if (1 == 0) {
return 1;
}
else {
return 1 * 1;
}
即1
, 然后factorial(2)
:
if (2 == 0) {
return 1;
}
else {
return 2 * 1;
}
这是2
。
请注意,递归调用之间没有“连接”——它们不共享任何变量或其他数据,它们的参数恰好具有相同的名称——并且return
不会返回到“最顶层”调用者,而只会返回到最直接的调用者一,就像其他功能一样。
推荐阅读
- react-native - `render()` 函数内第一行引用的`this.props` 定义在哪里?
- python-3.x - 如何在不循环所有单元格的情况下将 openpyxl 单元格的范围转换为 pandas 数据框?
- css - 不透明度的CSS转换scaleX在Safari中不起作用
- php - 使用 laravel 的 Paypal 退款金额
- tensorflow - 如何在高级 Estimator api 中使用 tf.print(不是 tf.Print)
- python - 通过 python 脚本或使用 django 模型每小时更新一次 PostgreSQL 数据库?
- sqlite - 部署 Universal App 后部署的 SQLite 数据库为空
- ios - 如何搜索所有目录?目标 C
- polymer - 未捕获的 DOMException:无法在“CustomElementRegistry”上执行“定义”:此名称已用于此注册表
- c# - C++ 中的 C# SecureCode 等价物是什么?