ある関数を別の関数から呼び出すという考えは、関数が自分自身を呼び出す可能性をすぐに示唆します。Java の関数呼び出しメカニズムは、再帰と呼ばれるこの可能性をサポートしています。再帰は強力な汎用プログラミング手法であり、情報処理の基本的なサポートを提供する組み合わせ検索および並べ替えメソッド (第 4 章) から信号処理の高速フーリエ変換 (第 4 章9)。
初めての再帰プログラム。再帰の HelloWorld は階乗関数を実装することです。これは正の整数 N に対して次の式で定義されます。
N! = N × (N-1) × (N-2) × ... × 2 × 1
ん!for ループで簡単に計算できますが、Factial.java でのさらに簡単な方法は、次の再帰関数を使用することです。
public static int factorial(int N) {
if (N == 1) return 1;
return N * factorial(N-1);
}
factorial() が 1 = 1 を返すことに注意することで、目的の結果が生成されることを自分自身に納得させることができます! N が 1 の場合、値が適切に計算される場合
(N-1)! = (N-1) × (N-2) × ... × 2 × 1
次に、値を適切に計算します
N! = N × (N-1)! = N × (N-1) × (N-2) × ... × 2 × 1
関数呼び出しのシーケンスをトレースするのと同じ方法で、この計算をトレースできます。
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
return 1
return 2*1 = 2
return 3*2 = 6
return 4*6 = 24
return 5*24 = 120
factorial() の実装は、すべての再帰関数に必要な 2 つの主要コンポーネントを示しています。
The base case returns a value without making any subsequent recursive calls. It does this for one or more special input values for which the function can be evaluated without recursion. For factorial(), the base case is N = 1.
The reduction step is the central part of a recursive function. It relates the function at one (or more) inputs to the function evaluated at one (or more) other inputs. Furthermore, the sequence of parameter values must converge to the base case. For factorial(), the reduction step is N * factorial(N-1) and N decreases by one for each call, so the sequence of parameter values converges to the base case of N = 1.
Now in your case (n==1) is the base condition or terminating condition.
recurse(4,'A','B','C')
recurse(3,'A','C','B')
recurse(2,'A','B','C')
recurse(1,'A','C','B')
return : 1 A C
return : 2 A B
return : 3 A C
return : 4 A B
final output :
1 A C
2 A B
3 A C
4 A B