簡體   English   中英

c ++階乘程序中的遞歸

[英]Recursion in c++ Factorial Program

你好,我有這段代碼是基於其他遞歸和階乘程序編寫的,但是我的問題是我真的很困惑它如何存儲值並保留它,然后在最后返回它

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返回實際答案,它實際上在做什么?

來自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
    }
}

希望這可以幫助。

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; 這是正在檢查的條件。

遞歸函數將大問題分解為較小的案例。

查看您的程序:

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

從本質上講,它結合了對因數查找器的調用堆棧的結果,直到您遇到基本情況為止,在這種情況下,x = 1。

好了,可以使用或不使用遞歸來編寫階乘函數,但是遞歸中的主要考慮因素是該函數使用系統堆棧,因此,對函數的每次調用都是系統堆棧中的一個項目,就像這樣(從從下到上):

在此處輸入圖片說明

遞歸函數中的其他考慮因素是該函數有兩個主要代碼段:

  1. 基本案例
  2. 遞歸案例

在基本情況下,遞歸函數返回限制算法的元素,並停止遞歸。 在階乘中,此元素為1,因為從數學上講,數字1的階乘在定義上為1。 對於其他數字,您不知道階乘,因此,您必須使用公式進行計算,並且該公式的一種實現是使用遞歸,因此是遞歸情況。

示例:5的階乘,過程為:5 * 4 * 3 * 2 * 1 = 120,請注意,您必須將每個數字從最高值乘以1,換句話說,直到發生基本情況為您已經知道的情況。

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM