黑马程序员----在黑马论坛中看到的一个题目(从5个数中取三个,递归)


                                                      -------  android培训 java培训 、期待与您交流! ----------

链接地址:http://bbs.itheima.com/thread-149240-1-1.html
题目是这样的:从1,2.。。n中取r个数,r < n,不可重复,有多少种取法。例如,从1,2,3,4,5中取3个数,共有123;124;125;134;135;145;234;235;245;345.这十种取法。程序代码该怎么写?

首先我看到这个题目第一想法就是用三层循环套上去,代码如下:
public class Main {
        public static void main(String[] args)  {                   
                for( int i = 1; i <= 5; i++ )
                for( int j = i+1; j <= 5; j++ )
                for( int k = j+1; k <= 5; k++ )     {
                        System.out.print( i+""+j+""+k+",");
                }
        }
}


因为题目给出的10个中都是有序的,所以直接枚举就可以了,
接下来我们看下递归该怎么写(详情见注解):
import java.util.Arrays;

public class Main {

	public static boolean flag[] = new boolean[10];

	public static void main(String[] args) {
		Arrays.fill(flag, false);  //flag是用作标记,表示哪些数是已经被选了的,若果为true则被选
		dfs(0, 0); //下标从0开始,输出的时候+1即可
	}

	//这里的id是表示选了多个数,如果是3的话表示选了三个,然后输出返回重新选择
	//index表示下标,因为题目只给定了5个数,所以如果index>=5的话就返回
	public static void dfs(int id, int index) {
		if (id == 3) {
			//输出flag中为true的下标,表示选了的数
			for (int i = 0; i < 5; i++)
				if (flag[i]) System.out.print(i+1);
			System.out.println();
			return;
		}
		
		if (index >= 5)	return;

		
		for (int i = index; i < 5; i++) {
			//关键在这里,如果当前位置被选了那么index往后找,id不加,千万不能continue
			if ( flag[i] ) dfs(id, i + 1);
			else {
				if (!flag[i]) {
					//如果没有被选,标记选上,继续往后走
					flag[i] = true;
					dfs(id + 1, i + 1);
					//返回了的话就把标记去掉,用于下次用
					flag[i] = false;
				}
			}
}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值