首页 > 解决方案 > 关于这个递归函数的问题

问题描述

查找输入 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;
}

我的问题是:

  1. 这里写了 factorial(num-1) 那么变量 num 如何在每个循环中减少?该函数将永久使用 num-1 作为其参数,但不会保存 num。我的意思是应该有 num--; 在函数中。我已经尝试并在程序结束时打印出变量 num,它是相同的,num 不是 0。

  2. 这里写 if (num == 0) { return 1; } 。当 num 减少到 0 时,函数不应该将 1 作为最终值吗?但事实并非如此。就像变量一样,当你在程序末尾写 a = 1 时;那么不管a之前发生了什么计算,a的最终值都是1。据我所知return 1; 有同样的效果,不是吗?

非常感谢

标签: c++

解决方案


递归函数的工作方式与非递归函数完全一样——没有“循环”,也没有递减。

也许替代方法会有所帮助。

考虑factorial(2)

如果我们在函数体中替换num2

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不会返回到“最顶层”调用者,而只会返回到最直接的调用者一,就像其他功能一样。


推荐阅读