黑马程序员技术交流社区
标题:
N 个数字可以组成多少种组合?
[打印本页]
作者:
cat73
时间:
2016-7-20 00:07
标题:
N 个数字可以组成多少种组合?
输出 N 个数字可以组成的所有组成方式,并输出组合的总数。
public final class Main {
public static void main(final String args[]) throws Throwable {
final int N = 4;
final int count = Main.list(N);
System.out.println(N + " 个数字可以组成 " + count + " 种组合.");
}
/**
* 打印 n 个数字可以组成的所有组合,并返回组合的总数
* @param n 有几个数字
* @return 组合的数量
*/
public static int list(final int n) {
// 生成一个临时数组包含 (0) ~ (n - 1) 的所有数字
final Integer[] arr = new Integer[n];
for (int i = 0; i < n; i++) {
arr[i] = i;
}
// 调用 list 方法来打印所有组合
return Main.list(arr, 0);
}
/**
* 打印一些元素可以组成的组合数量
* @param arr 元素列表
* @param i 当前递归的位置,调用时请传 0
* @return 组合的数量
*/
public static <T> int list(final T[] arr, final int i) {
// 如果当前元素是最后一个元素
if (i == arr.length - 1) {
// 打印当前组合
for (final T t : arr) {
System.out.print(t);
System.out.print(" ");
}
System.out.println();
return 1;
} else {
// 当前位置的组合总数
int count = 0;
// 循环将当前位置上的元素与其后的元素进行交换,然后递归调用 list 方法
for (int j = i; j < arr.length; j++) {
Main.swap(arr, i, j);
count += Main.list(arr, i + 1);
Main.swap(arr, i, j);
}
// 返回当前位置的组合总数
return count;
}
}
/**
* 将数组中的两个元素进行交换
* @param array 要被交换元素的数组
* @param i 第一个元素的下标
* @param j 第二个元素的下标
*/
public static <T> void swap(final T[] array, final int i, final int j) {
final T t = array[i];
array[i] = array[j];
array[j] = t;
}
复制代码
示例输出:
0 1 2 3
0 1 3 2
0 2 1 3
0 2 3 1
0 3 2 1
0 3 1 2
1 0 2 3
1 0 3 2
1 2 0 3
1 2 3 0
1 3 2 0
1 3 0 2
2 1 0 3
2 1 3 0
2 0 1 3
2 0 3 1
2 3 0 1
2 3 1 0
3 1 2 0
3 1 0 2
3 2 1 0
3 2 0 1
3 0 2 1
3 0 1 2
4 个数字可以组成 24 种组合.
复制代码
作者:
橘子哥
时间:
2016-7-20 10:03
老司机,好厉害
作者:
梦回初中三班_
时间:
2016-7-20 10:13
滴滴,学生卡
作者:
sunke1229
时间:
2016-7-20 11:54
额 不是排列组合a吗 4!=24...
作者:
怡蓝
时间:
2016-7-20 20:51
好复杂,好复杂啊,好复杂啊啊啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2