再帰関数はそれ自体を呼び出す関数です
これにより、プログラマは最小限のコードを使用して効率的なプログラムを作成できます。
欠点は、適切に記述しないと、無限ループやその他の予期しない結果を引き起こす可能性があることです。
Simple Recursive関数とTail Recursive関数の両方を説明します
単純な再帰関数を書くために
- 最初に考慮すべき点は、ループから抜け出すことを決定するタイミングです。これはifループです。
- 2つ目は、私たちが自分の機能である場合に実行するプロセスです。
与えられた例から:
public static int fact(int n){
if(n <=1)
return 1;
else
return n * fact(n-1);
}
上記の例から
if(n <=1)
return 1;
ループを終了するときの決定要因です
else
return n * fact(n-1);
実際に行われる処理です
わかりやすいように、1つずつ作業を中断してみましょう。
実行すると内部で何が起こるか見てみましょう fact(4)
- n = 4を代入
public static int fact(4){
if(4 <=1)
return 1;
else
return 4 * fact(4-1);
}
If
ループが失敗するのでelse
ループに戻り、戻る4 * fact(3)
スタックメモリには、 4 * fact(3)
n = 3を代入
public static int fact(3){
if(3 <=1)
return 1;
else
return 3 * fact(3-1);
}
If
ループは失敗するのでループしelse
ます
それで戻る 3 * fact(2)
`` `4 * fact(3)` `を呼び出したことを思い出してください
の出力 fact(3) = 3 * fact(2)
これまでのところ、スタックは 4 * fact(3) = 4 * 3 * fact(2)
スタックメモリには、 4 * 3 * fact(2)
n = 2を代入
public static int fact(2){
if(2 <=1)
return 1;
else
return 2 * fact(2-1);
}
If
ループは失敗するのでループしelse
ます
それで戻る 2 * fact(1)
電話したことを覚えている 4 * 3 * fact(2)
の出力 fact(2) = 2 * fact(1)
これまでのところ、スタックは 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
スタックメモリには、 4 * 3 * 2 * fact(1)
n = 1を代入
public static int fact(1){
if(1 <=1)
return 1;
else
return 1 * fact(1-1);
}
If
ループは真です
それで戻る 1
電話したことを覚えている 4 * 3 * 2 * fact(1)
の出力 fact(1) = 1
これまでのところ、スタックは 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1
最後に、fact(4)= 4 * 3 * 2 * 1 = 24の結果
末尾再帰はなり
public static int fact(x, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(x-1, running_total*x);
}
}
- n = 4を代入
public static int fact(4, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(4-1, running_total*4);
}
}
If
ループが失敗するのでelse
ループに戻り、戻るfact(3, 4)
スタックメモリには、 fact(3, 4)
n = 3を代入
public static int fact(3, running_total=4) {
if (x==1) {
return running_total;
} else {
return fact(3-1, 4*3);
}
}
If
ループは失敗するのでループしelse
ます
それで戻る fact(2, 12)
スタックメモリには、 fact(2, 12)
n = 2を代入
public static int fact(2, running_total=12) {
if (x==1) {
return running_total;
} else {
return fact(2-1, 12*2);
}
}
If
ループは失敗するのでループしelse
ます
それで戻る fact(1, 24)
スタックメモリには、 fact(1, 24)
n = 1を代入
public static int fact(1, running_total=24) {
if (x==1) {
return running_total;
} else {
return fact(1-1, 24*1);
}
}
If
ループは真です
それで戻る running_total
の出力 running_total = 24
最後に、fact(4,1)= 24の結果