私は『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
要点を理解していただければ幸いです。