【 알고리즘 】 재 귀적 DFS (깊이 검색)

17831 단어 필기시험
기능: 배열 [1, 2, 3, 4, 5] 에 대해 가능 한 모든 조합 방식 을 출력 합 니 다.
예 를 들 어 1, 2, 3, 4, 5 중에서 3 개 수 를 선택 하면 도대체 몇 가지 조합 이 있 습 니까?해결 방안: 먼저 하나의 수 를 선택 한 다음 에 나머지 4 개의 수 중에서 2 개의 수 를 선택 한 다음 에 나머지 3 개의 수 중에서 1 개의 수 를 선택한다.0 개 수 를 선택 하여 재 귀 할 때 까지...그리고 밖 에 순환 을 하면 배열 1, 2, 3, 4, 5 의 모든 가능 한 조합 방식 을 얻 을 수 있다.참조 링크
public class test1 {
	public static void digui(int [] nums) {
		for(int i = 1; i <= nums.length; i++) {
			int out[] = new int[i];
			helper(nums, nums.length, i, out, i);
		}
	}
	
	public static void helper(int[] input, int inputlen, int m, int [] out, int outlen) {
		//      :    input inputLen      m    ,    out   
		//@input         ,   {0,1,2,3,4},         
		//@inputLen   input  inputLen  ,  inputLen=3,   input {0,1,2}
		//@m      m   ,  m=2,inputLen=3,       :{0,1}{0,2}{1,2}
		//@out          。       ,m=3, out   {1,2,3}{1,2,4} 
		//@outLen out   	
		
		//      	
		if (m == 0) {
			for(int i = 0; i < outlen; i++) {
				System.out.print(out[i]);
				System.out.print("->");
			}
			System.out.println();
			return;
		}
		
		//       inputlen---->m
		//    m  ,    i (inputlen, i  )   >=m
		for(int i = inputlen; i >= m; i--) {
			//           
			out[m-1] = input[i-1];
			//  ,    inputlen m
			helper(input, i - 1, m - 1, out, outlen);
		}
	}
	public static void main(String[] args) {
		int[] nums = new int[5];
		for(int i = 0; i < nums.length; i++) {
			nums[i] = i + 1;
		}
		digui(nums);
	}
}5->
4->
3->
2->
1->
4->5->
3->5->
2->5->
1->5->
3->4->
2->4->
1->4->
2->3->
1->3->
1->2->
3->4->5->
2->4->5->
1->4->5->
2->3->5->
1->3->5->
1->2->5->
2->3->4->
1->3->4->
1->2->4->
1->2->3->
2->3->4->5->
1->3->4->5->
1->2->4->5->
1->2->3->5->
1->2->3->4->
1->2->3->4->5->

좋은 웹페이지 즐겨찾기