繁体   English   中英

了解递归,C ++

[英]Understanding Recursion, c++

对于下面的代码,有人可以告诉我,如果基本情况(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;
}

如果您看一下阶乘的定义方式,将会发现:

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

因此,您的函数的确会为factorial(0)返回错误的值。 该函数的递归基本上是通过在factorial每个新函数调用中递减n来实现的。

假设您调用factorial(3) n表示3时,else分支将执行,因为n不等于零。 我们遵循定义的第三条规则,称为call factorial(2) (n-1),并将其结果乘以n。 您的函数将逐步降低,直到调用factorial(0)并返回0,然后它才是所有先前计算的因数,得出3*2*1*0 ,等于0

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

由于任何乘以零的数字均为零,因此它将返回零。 您从某个数字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)

但是factorial(1-1)是factorial(0),它返回0,所以您得到:

5 * 4 * 3 * 2 * 1 * 0 = 0

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

有人选择这样做。 您必须问作者为什么要这么做。

我知道为了更正此功能,我只需要用“ return 1”替换“ return 0”,但是,我试图理解为什么对于下面的基本情况它返回0。

可能是因为撰写此书的人认为0! 等于0。

我没有完全让你问问题,但让我们对函数f(int n)进行校准:int okey使其更短

对于n = 0,它将返回0,因为这就是您告诉它要执行的操作:if(n == 0)返回0; 对于n + 1,您将获得以下模式:f(n + 1)==> n * f(n)因为那是您告诉它可以执行其他操作的权利? 和f将再次评估。

因此,这就是为什么您的函数在任何情况下都将返回0的原因,如果将基本情况更改为1,则会得到:

对于任何n (大于或等于0),您都将许多数字相乘到factorial(0) ,这将返回0。

的结果

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

是个大胖子0

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM