1. 반복 가능한 배열 : ABC에는 3 개의 문자와 모든 줄의 길이 3, AAA, AAB, AAC ...... CCC에는 총 27 가지 종류가 있습니다.
재귀 아이디어를 사용하여 첫 번째 문자는 ABC와 세 가지 선택에서 선택할 수 있습니다. 그런 다음 문제는 ABC가 길이 2의 문자로 구성된 경우로 변환됩니다. 루프 재귀 후 모든 가능성을 찾을 수 있습니다. 루프 종료 조건을 제어하십시오.
재귀는 그것을 처리하는 데 사용될 수 있으며, 문자 길이를 알 수없는 경우 일반적인 처리입니다. 길이를 알고 있다면 결론을 도출하기 위해 여러 층의 루프 만 사용하면됩니다.
공개 클래스 순열 {public static void main (String [] args) {char [] chs = { 'a', 'b', 'c'}; per (New Char [3], CHS, 3-1); } public static void per (char [] buf, char [] chs, int len) {if (len == -1) {for (int i = buf.length -1; i> = 0; --i) system.out.print (buf [i]); System.out.println (); 반품; } for (int i = 0; i <chs.length; i ++) {buf [len] = chs [i]; per (buf, chs, len-1); }}}반복 가능한 선택, 총 27 개의 상황, 결과는 아래 그림에 나와 있습니다.
2. 전체 배열 : 여전히 세 문자 ABC, 전체 배열은 문자를 반복 할 수 없음을 의미합니다. 마지막 3*2 = 6 결과
방법을 1에서 사용할 수 있으며, 세 문자가 동일했는지 여부를 결정하는 한, 동등하지 않은 전체 배열의 문자는 필요한 것입니다. 그러한 시간 복잡성은 n^n이고, 전체 배열의 유형은 n입니다! 그래서 우리는 일종의 n을 설계해야합니다! 연산.
재귀를 사용할 수도 있습니다. 첫 번째 문자열에 대한 N 선택이 있으며 나머지는 N-1 스케일 재귀 문제가됩니다. 첫 번째 문자에 대한 N 선택은 모두 문자열에 있습니다. 따라서, 첫 번째 문자는이를 1-N 위치와 교환하여 N의 상황을 얻은 다음 N-1의 척도를 재귀 적으로 처리 할 수있다. 그러나 처리 후 교체하고 원래 문자가되어야합니다.
공개 클래스 정렬 {public static void main (String [] args) {char [] chs = { 'a', 'b', 'c'}; 정렬 (chs, 0, chs.length); } public static void array (char [] chs, int start, int len) {if (start == len-1) {for (int i = 0; i <chs.length; ++ i) system.out.print (chs [i]); System.out.println (); 반품; } for (int i = start; i <len; i ++) {char temp = chs [start]; chs [start] = chs [i]; CHS [i] = 온도; 배열 (chs, start+1, len); 온도 = chs [시작]; chs [start] = chs [i]; CHS [i] = 온도; }}}작업 결과는 아래 그림에 표시되며 총 6 개의 조합이 있습니다.
3. 조합 : 세 문자 ABC의 모든 조합
모든 조합, 즉 각 ABC의 비트가 선택되었는지 여부, 첫 번째 비트는 2이고 두 번째 비트는 2입니다. . 따라서 총 2^N 유형이 있습니다. 0은 선택하지 않음을 의미하며 1은 선택을 의미하므로 AB는 110으로 표시 될 수 있습니다. ABC의 총 표현은 0에서 2^3-1입니다. 그런 다음 비트 시합 작동, 결과가 1 인 경우 현재 비트가 출력되고 결과 0은 출력되지 않습니다.
public class comb {public static void main (String [] args) {char [] chs = { 'a', 'b', 'c'}; 콤 (CHS); } public static void comb (char [] chs) {int len = chs.length; int nbits = 1 << len; for (int i = 0; i <nbits; ++ i) {int t; for (int j = 0; j <len; j ++) {t = 1 << j; if ((t & i)! = 0) {// 작업이 1 System.out.print (chs [j]) 인 경우 1 만됩니다. }} system.out.println (); }}}출력 결과는 다음과 같습니다. 첫 번째 행동은 비어 있으므로 아무도 취하지 않음을 의미합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.