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 開発者の Web サイトからの再帰イメージ。

出典: 画像は以下から取得: IBM Developers Web サイト

上の写真を見ていただければ、より理解が深まります。数値が格納されることはありませんが、出力を計算するために再帰的に呼び出されます。

したがって、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 に答える
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

基本的には、基本ケース (この場合は x = 1) に到達するまで factorialfinder への呼び出しのスタックの結果を結合します。

于 2013-08-06T21:08:04.937 に答える
1

階乗関数は、再帰を使用するかどうかに関係なく記述できますが、再帰での主な考慮事項は、これがシステム スタックを使用することです。そのため、関数への各呼び出しは、このようにシステム スタック内のアイテムです (下から上へ):

ここに画像の説明を入力

再帰関数のその他の考慮事項は、これには 2 つの主要なコード部分があることです。

  1. ベースケース
  2. 再帰ケース

基本ケースでは、再帰関数は、アルゴリズムを制限し、再帰を停止する要素を返します。階乗では、この要素は 1 です。これは、数学的には、最初の階乗が定義により 1 であるためです。階乗がわからない他の数値については、そのため、式を使用して計算する必要があり、その実装の 1 つは再帰を使用しているため、再帰ケースです。

例: 5 の階乗、手順は次のとおりです: 5*4*3*2*1 = 120、一番上の値から 1 までの各数値を乗算する必要があることに注意してください。あなたがすでに知っているケース。

于 2013-08-06T21:45:11.460 に答える