c ++ Factorial Program中的递归

时间:2013-08-06 21:04:58

标签: c++ recursion

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

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

所以5进去,并通过一次又一次地调用它的函数再乘以4,然后它变为1并返回阶乘答案

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

5 个答案:

答案 0 :(得分:9)

Recursion image from IBM developers website.

来源:图片来自:IBM Developers website

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

因此,当您调用事实(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
    }
}

希望这有帮助。

答案 1 :(得分:5)

返回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;这是被检查的条件。

答案 2 :(得分: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。

答案 3 :(得分:1)

因此,阶乘函数可以使用递归来编写,但递归中的主要考虑因素是这个函数使用系统堆栈,因此,每次调用函数都是系统堆栈中的一个项目,如下所示: / p>

https://dl.dropboxusercontent.com/u/14246044/stack.png(抱歉图片,但我没有声望发布图片:()

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

  1. 基本情况
  2. 递归案例
  3. 在基本情况下,递归函数返回算法的更基本元素,在这种情况下,此元素为1,因为数学上第一个因子是1,但您不知道谁是其他数字的因子这个原因你必须使用公式,因此你必须使用递归的情况,例如

    阶乘5,程序为:5 * 4 * 3 * 2 * 1 = 120,注意你必须将每个数字从最高值乘以第一个,换句话说,直到基本情况发生为止是你已经知道的情况。

答案 4 :(得分: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;
}