Java初心者の競技プログラミング日記

Dvorak配列でjavaを書いてます

再帰関数入門・全探索編

ビット全探索でやった内容(ビット全探索 - Java初心者の競技プログラミング日記)を、
再帰関数でもやってみようという試み。

import java.util.*;
import static java.lang.System.*;

public class Test {
	static Scanner sc = new Scanner(System.in);
	public static void main(String[] args) {
		char[] ar = {'a','b','c'};
		rec("-",0,ar);
	}

	static void rec (String s, int n, char[] ar) {
		if (n==ar.length) {out.println(s);}
		else {
			rec(s,n+1,ar);
			rec(s+ar[n],n+1,ar);
		}
	}
}

/*出力

-
-c
-b
-bc
-a
-ac
-ab
-abc

*/


n=0のとき、

・rec("-", 1, ar) ar[0]='a'を加えない場合
・rec("-a", 1, ar) 'a'を加える場合


というふうに処理される。

以降、n=1のときはbを加えるか加えないかの処理がなされ、n=2のときには同様にcの処理がなされる。n=3(集合の要素数と同値)のときに出力。

ビット全探索と再帰、どちらを使うかは問題によると思う。