質問: ``` void calculate(int a, int b, int c){ //何らかの処理 calculate(a+1,b+1,c+1);//再帰呼び出し calculate(a-1,b-1,c-1); } void main{//mainメソッド calculate(2,2,2); } ``` 再帰呼び出しについて疑問があるので質問させてください。上のプログラムでは、calculateメソッドと、mainメソッドの2つのメソッドがあります。mainメソッドではまず、引数をa=2とb=2とc=2としてcalculateメソッドで呼び出しています。そうすると、calculateメソッドでは何らかの処理をし、今度は、a=3,b=3,c=3で再帰呼び出しをします。しかし、そうすると、2つめの再帰呼び出しはいつ行われるのでしょうか。1つめの再帰呼び出しが停止してからですか?再帰呼び出しは、処理の部分で何らかの条件で止めます。 また、最初に引数a=2とb=2とc=2としてcalculateメソッドを呼び出しましたが、そのaとbとcの値のままcalculate(a-1,b-1,c-1)を呼び出すにはどうしたら良いですか?つまり、最初に引数a=2とb=2とc=2でcalculateメソッドを呼ぶと、最初のcalculate(a+1,b+1,c+1)の部分の再帰呼び出しで、aとbとcの値がリセットされてしまうと思うのですが、それを阻止する方法というのはないのでしょうか。 なるべく配列などは使わない方向でいきたいです。長文で質問分かりづらくて、プログラムもあまり具体的でなくてすみません。よろしくお願いします。
回答: わかりやすく考えるために、「再帰呼び出し」という特殊な呼び出し方と捉えるのではなく、「たまたま同じ名前のメソッドを呼び出しただけ」と考えてください。Javaの場合はそう捉えて全く問題ありません。 > > 2つめの再帰呼び出しはいつ行われるのでしょうか。1つめの再帰呼び出しが停止してからですか? > > > はい、ふつうのメソッド呼び出しと同様、1つ済んでから次へ進みます。 > > そのaとbとcの値のままcalculate(a-1,b-1,c-1)を呼び出すにはどうしたら良いですか? > > > そのままで問題ありません。同じメソッドでも、ローカル変数は実行ごとに別物になります(プリミティブな`int`なので、「状態変化」を考える必要もありません)。