【算法】递归DFS(深度搜索)

功能:对于数组[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->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值