属性を宣言するか、各再帰呼び出しで変更可能なオブジェクトを更新するように指示するすべての回答を忘れてしまいます。真の機能、再帰的スタイルでは、パラメータや戻り値の型として渡すことで情報を "保持"します。
簡単な例で説明しますが、int[]
の要素の合計を再帰的に計算したいとします。ここで、の状態(再帰呼び出しの間に保持する必要のある情報)は、配列内の現在のインデックスおよびこれまでの合計です。ここでそれを行う方法は次のとおりです。
public int sum(int[] array) {
return sum(array, 0, 0);
}
private int sum(int[] array, int idx, int acc) {
if (idx == array.length)
return acc;
return sum(array, idx+1, acc+array[idx]);
}
はこのようにそれを呼び出していない:属性あなたが見ることができるように、(静的またはインスタンス)を宣言する必要はありません
int[] array = {1, 2, 3};
System.out.println(sum(array));
、そして合格し、可変変更する必要オブジェクト(リスト、マップ) - 問題を解決するために必要なすべての情報がメソッドパラメータとして存在するため、ローカル変数も使用していません。
v
変数のコードでは、答えがacc
であることを想定しています。すなわち、再帰が呼び出されるたびに累積された値が変更されます。最後に、累積値をヘルパー関数(void
戻り値の型を持たないもの)から返す必要があります。その値はfoo()
になります。
したがって、静的変数は再帰を使用する唯一の方法ですか? – user1220022
@ user1220022絶対にそうではなく、再帰中に状態を格納するための属性を使うことは(一般的に)必要ではありません。私の答えを見て、私は状態を追跡するためのパラメータだけを使用し、変数は使用されていません。 –