2017-01-03 3 views
-8

私はこの方法がすべてm=1n=1までであることを理解しています。 if()の後に、m=1n=1に問題が発生した場合はどうなりますか?なぜこの再帰的な方法は階乗と見なされますか?

public class exc { 

    public static void main(String[] args) { 
     System.out.println(prod(1, 4)); 
    } 

    public static int prod(int m, int n) { 

     if (m == n) { 
      return n; 

     } else { 
      int recurse = prod(m, n - 1);      

      int result = n * recurse;  // how n gets its value here? 
      return result; 

     } 
    } 
} 
  1. 再帰の値は何ですか?私は、どのようにしての整数しか得られないのでしょうか?

  2. であれば、プログラムはそこで終了しないので、なぜM = 1およびn = 1戻り値が1である(それは2つの整数を有しているため)?代わりに、 "return result;"の後に終了します。他に?

  3. 後m = 1であり、n = 1、nが2(再帰で)。 nは2にどのように設定されていますか?それは2がまだ記憶にあり、扱われなければならなかったからですか?

私はアウトプットを確認するには、それぞれの行の後のprintlnをも使用しますが、それはどちらかの助けにはならなかったthis page

をチェックします。私もデバッガを使いました。

メートル= 1 この例を取るとき、あなたのプログラムは階乗を返す
+2

(メモリから値をバックロード)自身を実行し続けて? – Guy

+1

*が*であるため、これは「要因」とみなされます。あなたが何を求めているのか不明です。 – EJP

+0

[理解再帰](http://stackoverflow.com/questions/717725/understanding-recursion)の可能性の重複とhttp://stackoverflow.com/questions/3021/what-is-recursion-and-when-should- i-use-it – Azodious

答えて

1

:(M = 1、N = 4)

4 != 1 -> so you call recursively prod(1, 3) 
    3 != 1 -> so you call recursively prod(1, 2) 
     2 != 1 -> so you call recursively prod(1, 1) 
      1 == 1 -> you return 1 to the last call 
     In this call, recurse = 1 and n = 2 so you return 2 to the upper call 
    Here, recurse = 2, n = 3, so you return 6 to the upper call 
Here, recurse = 6, n = 4, so you return 24 to the upper call 

END OF FUNCTION, result is 24 which is 4! 

あなたは再帰関数PRODを呼び出すたびに、現在の関数prodAですprodBが何かをprodAに返すまで、新しい関数prodBを実行するために一時停止(その変数の値をメモリに保存)します。その後、Aは、デバッグでこれを実行し、参照方法について

関連する問題