「再帰(再帰呼び出し、再帰処理)」とは、あるメソッドから、そのメソッド自信を呼び出す処理です。
再帰では、適切な終了条件を用意しておかなければ、無限ループのような状態になってしまいます。
以下、再帰の例を示します。
package sample; public class Sample { public static void main(String[] args) { up(0); } public static int up(int i) { if (i < 3) { System.out.println(i); up(i + 1); } return i; } }
0 1 2
再帰は、繰り返し処理という意味でループ処理と似ています。しかし。メソッドでは、そのメソッドごとにローカル変数が作成され、独立しています。そのため、処理毎に独立した値を保持することができ、ループ処理とは違った便利さがあります。
上記の例では、この特性は活かされていません。通常のループ処理で書いた方が適切な処理だと言えます。
以下、再帰の特性を活かした、少し複雑なプログラムを示します。
package sample; public class Sample { public static void main(String[] args) { System.out.println(strCmb("abc")); } // 文字の組み合わせを生成 public static String strCmb(String src) { String res = ""; // 戻り値用文字列 int len = src.length(); // 文字列長 for (int i = 0; i < len; i ++) { char c = src.charAt(i); // 対象文字 String[] bArr = {""}; // 再帰結果の組み合わせ if (len >= 2) { // 2文字以上の場合は // 対象文字列以外を結合して再帰 String bck = strCmb( src.substring(0, i) + // 前の文字列 src.substring(i + 1) // 後の文字列 ); /* * 「"abc"」の「'b'」が対象文字の場合 * 「"a"」が前の文字列 * 「"c"」が後の文字列 * * 「"abc"」の「'a'」が対象文字の場合 * 「""」が前の文字列 * 「"bc"」が後の文字列 */ bArr = bck.split("\n"); // 改行で分割 } //対象文字列と、再帰結果の組み合わせを結合 for (int j = 0; j < bArr.length; j ++) { res += c + bArr[j] + "\n"; } } return res; } }
abc acb bac bca cab cba