输出 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 种组合.
复制代码
|
|