Javaで再帰を使用した階乗 質問する

Javaで再帰を使用した階乗 質問する

私は『Java: The Complete Reference』という本を使って Java を学習しています。現在は再帰というトピックに取り組んでいます。

ご注意ください:stackoverflow に同様の質問があります。検索しましたが、質問に対する解決策が見つかりませんでした。次のプログラムのロジックがわかりません。

以下のプログラムを実行すると正しい出力が生成されますが、そのロジックは理解できませんでした。

  • 次の行のロジックが理解できませんでした:結果 = fact(n-1) * n;
  • 私の知る限り、以下のプログラムに示すようにn=4の値を渡すと、
  • すると、結果には 3 * 4、つまり 12 が格納されます。
  • 再びfact(n-1)が呼び出されます。するとnは3になります。
  • 次に、2 * 3 が結果に格納され、前の 12 が置き換えられます。
  • 私がどこで行き詰まっているか、混乱しているか、お分かりいただけたと思います。

  • ありがとう。

class Calculation
{
    int fact(int n)
    {
        int result;

       if(n==1)
         return 1;

       result = fact(n-1) * n;
       return result;
    }
}

public class Factorial
{
     public static void main(String args[])
     {
       Calculation obj_one = new Calculation();

       int a = obj_one.fact(4);
       System.out.println("The factorial of the number is : " + a);
     }
}

ベストアンサー1

まず、階乗がどのように機能するかを理解する必要があります。

4! を例に挙げてみましょう。

4! = 4 * 3 * 2 * 1 = 24

上記の例を使用してコードをシミュレートしてみましょう。

int fact(int n)
    {
        int result;
       if(n==0 || n==1)
         return 1;

       result = fact(n-1) * n;
       return result;
    }

ほとんどのプログラミング言語には、と呼ばれるものがありますfunction stack。これはトランプのデッキのようなもので、各カードは他のカードの上に重ねられており、各カードは関数と考えることができます。つまり、メソッド を渡すと、次のようになりますfact

スタックレベル1:fact(4) // n = 4 and is not equal to 1. So we call fact(n-1)*n

スタックレベル2:fact(3)

スタックレベル3:fact(2)

スタック レベル 4: fact(1)// 現在、n = 1 です。したがって、この関数から 1 を返します。

値を返します...

スタックレベル3:2 * fact(1) = 2 * 1 = 2

スタックレベル2:3 * fact(2) = 3 * 2 = 6

スタックレベル1:4 * fact(3) = 4 * 6 = 24

つまり 24 になりました。

次の行に注意してください:

result = fact(n-1) * n;
           return result;

または単に:

return fact(n-1) * n;

これは関数自体を呼び出します。4を例にすると、

機能スタックに従って順番に。

return fact(3) * 4;
return fact(2) * 3 * 4
return fact(1) * 2 * 3 * 4

結果を代入しています...

return 1 * 2 * 3 * 4 = return 24

要点を理解していただければ幸いです。

おすすめ記事