2016-03-19 24 views
2

私は再帰的に新しいです、そして、この再帰的な階乗関数がどのように計算されるのか理解できません。再帰的な階乗を理解できません

私は私の心を持つコードを実行しようと、これは私がそれを視覚化する方法である:

もし数= 4、

第一リターン:4×3

第二リターン:3×2

第三リターン:だからで2×1

私の心は(4 x 3)*(3 x 2)*(2 x 1)ですが、明らかに正しい戻りは4 X 3 X 2 X 1になります。私はそれが4 X 3 X 2 X 1

public static long factorial(long number) { 
     if (number <= 1) 
      return 1; 
     else 
     { 
      System.out.println(number + " x " + (number-1)); 
      return number * factorial(number - 1); 
     } 
    } 

任意の助けを得ず、説明をいただければ幸い方法を理解することができるようにしたいです。

+0

Jonさんが疑問を解決する必要があります。それ以外の場合は、http://www.vogella.com/tutorials/EclipseDebugging/article.htmlを参照してください(デバッガはコードバグを識別するために使用されます)。プログラムフローの多くは、ロジック –

+0

あなたは戻り値ではなく、印刷行を視覚化しています。戻り値は単一のintです。 –

答えて

5

あなたの可視化は、次のようになります。

もし数= 4、

第一リターン:4×(第二リターン)

第二リターン:3×(第三リターン)

3回目の返品:2回(4回目返品)

4回目返品:1

これは、期待どおり4 x 3 x 2 x 1に簡略化されます。

基本的には、「戻り値x」と「値xを渡す再帰の結果を返す」の区別が必要です。

0

階乗の仕組みを理解するための鍵は、最後の反復からの答えが返されるということです。

階乗の各反復は、次の反復が返される前にそれを待たなければなりません。

実行される実際の操作は、4 * 3 * 2 * 1ではなく1 * 2 * 3 * 4です。値は最後から最初に返されます。

1

問題の一部は、あなたのprintステートメントが嘘であるということです。実際に何が起こっているかを確認するには、

System.out.println("factorial(" + number + ") = " + number + " x factorial(" + (number-1) + ")"); 

に変更してください。印刷出力は、私はそれが機能し、まあ、として再帰関数を理解するのに役立つことがわかりました

 | n * (n-1)!  for n > 1 
n! = | 
    | 1    for n == 0,1. 

という数学的な定義に似ている方法を次に検討します。関数の大きな利点の1つは、関数をカプセル化して特定の詳細を隠すことです。これは、それが達成されているかどうかにかかわらず、階乗(n-1)を返した関数を持っていれば、「再帰的な信仰の跳躍」—につながります。数学的な再帰に基づいて階乗を計算するのは簡単です定義。関数が動作することを信頼することは、(ほとんど)関数を書くのが簡単です!

関連する問題