0

你好,我有这段代码是我根据其他一些递归和阶乘程序编写的,但我的问题是我真的很困惑它如何存储值并保留它,然后在最后返回它

int factorialfinder(int x)
{
    if (x == 1)
    {
        return 1;
    }else
    {
        return x*factorialfinder(x-1);
    }
}
int main()
{
  cout << factorialfinder(5) << endl;
}

所以 5 进入,并通过一次又一次地调用它的函数来乘以 4,然后它得到 1 并返回阶乘答案

为什么?我不知道它是如何存储的,为什么 return 1 返回实际答案,它到底在做什么?

4

5 回答 5

9

来自 IBM 开发人员网站的递归图像。

来源:图片取自:IBM Developers 网站

只要看看上面的图片,你就会更好地理解它。该数字永远不会被存储,而是被递归调用以计算输出。

因此,当您调用 fact(4) 时,当前堆栈用于存储每个参数,因为递归调用发生在 factorialfinder(1)。所以计算是这样的:5*4*3*2*1。

int factorialfinder(int x)         
{
    if (x == 1)        // HERE 5 is not equal to 1 so goes to else
    {
        return 1;
    }else
    {
        return x*factorialfinder(x-1); // returns 5*4*3*2*1  when x==1 it returns 1
    }
}

希望这可以帮助。

于 2013-08-06T21:08:14.610 回答
5

Return 1 没有返回实际答案。它只是返回呼叫的答案

factorialfinder(1);

这发生在您的代码中。

在任何程序中,调用堆栈都是内存中用于跟踪函数调用的空间。此内存中的空间用于存储函数的参数以及该函数的返回值。每当某个函数 A 调用另一个函数 B 时,A 从该空间获取 B 的返回值。

递归函数没什么特别的,它只是一个调用另一个函数(恰好是它自己)的普通函数。所以真的,当一个递归函数 F 调用自己时,它正在调用另一个函数:F 调用 F',它调用 F'',它调用 F''',等等。只是 F,F'',F''' 等等. 执行相同的代码,只是输入不同。

该表达式if (x == 1)用于检查何时应停止此过程。F'''的返回值被F''使用。F'' 的返回值被 F' 使用。F'的返回值被F使用。

在某个数字的阶乘中,运算为 (n) * (n-1) * (n-2) * .... * ( 1 )。我强调了 1; 这是正在检查的条件。

于 2013-08-06T21:13:27.387 回答
2

递归函数将一个大问题分解为更小的情况。

回顾你的程序:

call factorialfinder with 5, result is stored as 5 * factorialfinder(4)

call factorialfinder with 4, result is stored as 5 * 4 * factorialfinder(3)

call factorialfinder with 3, result is stored as 5 * 4 * 3 * factorialfinder(2)

call factorialfinder with 2, result is stored as 5 * 4 * 3 * 2 * factorialfinder(1)

call factorialfinder with 1, result is stored as 5 * 4 * 3 * 2 * 1

本质上,它结合了对 factorialfinder 的堆栈调用的结果,直到您达到基本情况,在这种情况下 x = 1。

于 2013-08-06T21:08:04.937 回答
1

好吧,阶乘函数可以用递归也可以不写,但递归中主要考虑的是这个使用系统堆栈,所以,对函数的每次调用都是系统堆栈中的一项,像这样(从从下到上):

在此处输入图像描述

递归函数中的其他考虑因素是这个有两个主要代码段:

  1. 基本情况
  2. 递归案例

在基本情况下,递归函数返回限制算法并停止递归的元素。在阶乘中,这个元素是 1,因为在数学上,第一的阶乘在定义上是 1。对于其他数字,您不知道阶乘,因此,您必须使用公式进行计算,并且它的一种实现是使用递归,因此是递归情况。

示例:5 的阶乘,过程为:5*4*3*2*1 = 120,请注意,您必须将每个数字从最大值相乘直到数字 1,换句话说,直到发生基本情况,即你已经知道的情况。

于 2013-08-06T21:45:11.460 回答
0
#include<iostream>
using namespace std;

int factorial(int n);

int main()
{
    int n;

    cout << "Enter a positive integer: ";
    cin >> n;

    cout << "Factorial of " << n << " = " << factorial(n);

    return 0;
}

int factorial(int n)
{
    if(n > 1)
        return n * factorial(n - 1);
    else
        return 1;
}
于 2017-08-15T10:25:36.330 回答