链接地址: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;
}
}
}
}
}