-1

对于下面的代码,谁能告诉我,如果基本情况(n==0)的返回值为 0,为什么函数总是返回“0”?我知道为了更正这个函数,我只需要用“return 1”替换“return 0”,但是,我试图理解为什么它在下面的基本情况下返回 0。

谢谢你的帮助

int factorial(int n) { 
    if (n == 0) { 
        return 0; 
    } else {
        return n * factorial(n-1);
    }
}

编辑:希望下面的代码没有逻辑错误......

#include<iostream>
#include<math.h>
using namespace std;

long double factorial (long double n) {
    if (n==0) return 1;
    if (n<0) return -fabs((n*factorial(n+1)));
    return n*(factorial(n-1));
}

int main () {
    long double n;
    cout << "Enter a number: ";
    cin >> n;
    cout << "Factorial of " << n << " is " << factorial(n) <<endl;
    return 0;
}
4

6 回答 6

5

如果您看一下阶乘是如何定义的,您会发现如下内容:

f(0) = 1
f(1) = 1
f(n) = f(n-1) * n

所以你的函数确实返回了错误的值factorial(0)。这个函数中的递归基本上是通过n在每个新的函数调用中递减来工作的factorial

假设您调用factorial(3). n如果使用 3,else 分支将被执行为n不等于零。我们遵循定义调用的第三条规则factorial(2)(即 n-1)并将其结果乘以 n。您的函数将逐步下降,直到factorial(0)被调用并返回 0,这是所有先前计算的一个因子,结果为3*2*1*0,并且等于0

于 2011-11-20T00:56:26.610 回答
5

这段代码完全是错误的。无论将哪个 n > 0 作为参数,每个值最终都会乘以 0,因此对于所有 n > 0,阶乘(n)= 0。

于 2011-11-20T00:57:07.533 回答
5

它返回零,因为任何数字乘以零都是零。你从某个数字 n 开始,比如 n=5。当你经历递归时,你有:

n * factorial(n-1)
5 * factorial(5-1)
5 * 4 * factorial(4-1)
5 * 4 * 3 * factorial(3-1)
5 * 4 * 3 * 2 * factorial(2-1)
5 * 4 * 3 * 2 * 1 * factorial(1-1)

但是阶乘(1-1)是阶乘(0),它返回0,所以你得到:

5 * 4 * 3 * 2 * 1 * 0 = 0
于 2011-11-20T00:58:26.987 回答
1

对于下面的代码,如果基本情况(n == 0)的返回值为0,谁能告诉我为什么函数返回“0”?

有人选择这样做。你得问作者他们为什么这样做。

我知道为了更正这个函数,我只需要用“return 1”替换“return 0”,但是,我试图理解为什么它在下面的基本情况下返回 0。

可能是因为写它的人认为0!等于 0。

于 2011-11-20T00:56:08.687 回答
0

我没有完全问你问题,但让函数 f(int n): int okey 让它更短

对于 n = 0,它将返回 0,因为这就是您告诉它正确执行的操作: if(n == 0) return 0; 对于 n + 1,您将得到以下模式: f(n+1) ==> n * f(n) 因为这就是您告诉它的其他方式,对吗?f 将再次评估。

所以这就是为什么你的函数在任何情况下都会返回 0 并且如果你将基本情况更改为 1 你会得到:

于 2011-11-20T00:59:58.157 回答
0

对于任何东西n(大于或等于 0),您将很多数字乘以factorial(0)返回 0。

的结果

n*(n-1)*(n-2)*...*3*2*1*0

是个大胖子0

PS 除了没有正确计算之外,代码还有一个重大缺陷。如果你给它一个负数,你让它哭。

于 2011-11-20T01:00:43.560 回答