理解递归,c ++

use*_*993 -1 c++ recursion factorial

对于下面的代码,有人可以告诉我为什么如果基本情况(n == 0)的返回值为0,函数总是返回"0"?我知道为了纠正这个功能,我只需要将"return 0"替换为"return 1",但是,我试图理解为什么它为下面的基本情况返回0.

谢谢你的帮助

int factorial(int n) { 
    if (n == 0) { 
        return 0; 
    } else {
        return n * factorial(n-1);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

hal*_*dan 5

如果你看看如何定义阶乘,你会发现类似的东西:

f(0) = 1
f(1) = 1
f(n) = f(n-1) * n
Run Code Online (Sandbox Code Playgroud)

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

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


Sh4*_*4pe 5

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

  • 并且对于n <0,它无限地重复,然后溢出堆栈. (2认同)

Nic*_*kLH 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)
Run Code Online (Sandbox Code Playgroud)

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

5 * 4 * 3 * 2 * 1 * 0 = 0
Run Code Online (Sandbox Code Playgroud)