• 締切済み

メソッドの再帰呼び出しについて

再帰処理に関する質問をさせていただきます。私は今複数のarraylistの中に入っているオブジェクトを順列を用いてすべての並びを所得するプログラムを作っています。プログラムが長く汚いので(汗)、例で示させていただきます。 (例) ArrayList t1; ArrayList t2; t1の中身[obj1,obj2] t2の中身[obj3,obj4] 結果:以下のように4つオブジェクトを作成 [obj1,obj3],[obj1,obj4],[obj2,obj3],[obj2,obj4] それに伴い、メソッドを作り再帰呼び出しを行っているんですが、returnでメインに返りません。戻り値はvoidです。また、 return; System.out.println("check"); と書くと、checkが出力されてしまっています(しかも何個も)。IndexOutOfBoundsExceptionのエラーがでるのですが、先にreturnを処理するはずなのになぜだろうと悩んでいます。 return以外にメインに戻る方法はあるんでしょうか?またreturnでメインに戻らない理由を知っている方がいるなら、ぜひ教えていただきたいです。よろしくお願いします。

みんなの回答

回答No.2

全体の流れが見えないので、なんとも言えませんが……、 特に何個もcheckが出力されてしまうという辺りは状況の想像がまったくつきません。また2つのListの順列処理に再帰を持ち出すところもピンときませんが……、 1ついえることは――、 自分の中で自身の関数を呼び出すことを「再帰処理」といいます。そうして、return は「呼び出し元」に戻る、です。 呼び出し元がmainならmainへ、です。 でも、mainからsubfuncを呼んで、そのsubfuncの中でsubfuncを呼んで、そこでreturnされるとsubfuncの続きへ、んで、その続きでもう一度returnされて、やっとmainへと帰り着きます。 returnでメインに戻らない理由は、再帰呼び出しをしたため、returnしても自身に戻っただけだから、なのではありませんか? 再帰呼び出しを重ねた深層部で、一気にmainまで戻りたければ、戻り値をbooleanにして、trueになると連鎖的にreturnしていくように作ればOKです。その場合、再帰呼び出しの箇所は、たとえば、以下のようになるでしょう。 if (subfunc(...)) return true;

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

> return以外にメインに戻る方法はあるんでしょうか? メソッドの最後まで実行し終えるか、例外が投げられると戻りますが、今回は関係なさそうですね。 > returnでメインに戻らない理由 return が実行されたのに戻らないということはありえないので、return が実際には実行されていないというのが原因になります。つまり、処理の流れがおかしくなっているということです。 それにしても、プログラムが長いというのが気になりますね。単純な順列の列挙を再帰でやるなら 20 行足らずで書けると思うんですよ。アルゴリズムについてもう一度考え直してみてはどうでしょうか?

関連するQ&A