次のコードで再帰文の動作を説明してください。Javaでの再帰どのように動作するのですか?
int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1) * n;
return result;
}
私の理解では、ということである:上記の文で
がfactR(n-1)
方法は最後まで自身を呼び出します。 6の階乗を求めたいとします。この階乗は引数としてこのメソッドに送られます。それはパラメータn
として受信され、n
の値がチェックされます。 1の場合は1が返されます。しかし、1でない場合、6の場合のように、再帰文が実行されます。
私が直面する問題は、最初にn-1
が5になり、値6を保持するnで乗算され、30になります。
n-1
がそれ自身を呼び出して今度はn
と乗算され、IFが値 "6"を保持し、4 * 6 = 24となると私は間違っていると考えます。このようにすれば、次の呼び出しでは のプロセスはn-1
となり、同じ値、すなわち6を保持する3 * nとなり、3 * 6 = 18となるため、次の呼び出しが発生し、n-1
私が掛け合わせると2になり、値0を保持していると仮定すると、n-1
はn-1
つまり6-1を減らすことが明らかです= 5、次に5-1 = 4、4-1 = 3、3-1 = 2、および2-1 = 1である。しかし、質問はn
の値になります。この値は、メソッドがそれ自身を呼び出すたびに乗算されますか?
「n-1」が5になり、次に6が30に乗算され、30が「n」に格納され、次のコールで5-1 = 4 * 30 = 120 3-1 = 2 * 360 = 720、最後に1 * 720 = 720の場合、Javaは結果の値を変数n
に戻す方法をどのように決定しますか?
私は変数result
の値がメソッドは、このように、このように自分自身を呼び出すたびにあるかどうか確認するために別のステートメントを配置する場合:
int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1)*n ;
System.out.println(result);
return result;
}
その後、私はこの出力を得る:
2
6
24
120
720
Factorial of 6 is 720
最初の呼び出しで2がどのように生成されるのか分かりません。値2、次に6,24,120、および720はどこから来ますか?私はコードの作業にひどく悩まされていると思う。
コードをデバッグしましたか? – TheLostMind
あなたは間違った方向です。あなたの場合、最初に「30」を得ることはできません。それは '1 * 2'で始まり、結果を呼び出し元メトー' * 3'に渡します - 結果を呼び出し元メソッド '* 4'に渡します。再帰呼び出しの各呼び出しは、それがそれ以上の再帰を行わない点に達すると、先頭(最後の呼び出し)から最下位(最初の呼び出し)までずっと戻るスタックに置かれます。 – SomeJavaGuy
2は最初の呼び出しではありません.2番目の呼び出しです。最初の呼び出しがprintlnより先に戻ります。 – valepu