黑马程序员技术交流社区

标题: N 个数字可以组成多少种组合? [打印本页]

作者: cat73    时间: 2016-7-20 00:07
标题: N 个数字可以组成多少种组合?
输出 N 个数字可以组成的所有组成方式,并输出组合的总数。
  1. public final class Main {
  2.     public static void main(final String args[]) throws Throwable {
  3.         final int N = 4;
  4.         final int count = Main.list(N);
  5.         System.out.println(N + " 个数字可以组成 " + count + " 种组合.");
  6.     }

  7.     /**
  8.      * 打印 n 个数字可以组成的所有组合,并返回组合的总数
  9.      * @param n 有几个数字
  10.      * @return 组合的数量
  11.      */
  12.     public static int list(final int n) {
  13.         // 生成一个临时数组包含 (0) ~ (n - 1) 的所有数字
  14.         final Integer[] arr = new Integer[n];
  15.         for (int i = 0; i < n; i++) {
  16.             arr[i] = i;
  17.         }
  18.         
  19.         // 调用 list 方法来打印所有组合
  20.         return Main.list(arr, 0);
  21.     }

  22.     /**
  23.      * 打印一些元素可以组成的组合数量
  24.      * @param arr 元素列表
  25.      * @param i 当前递归的位置,调用时请传 0
  26.      * @return 组合的数量
  27.      */
  28.     public static <T> int list(final T[] arr, final int i) {
  29.         // 如果当前元素是最后一个元素
  30.         if (i == arr.length - 1) {
  31.             // 打印当前组合
  32.             for (final T t : arr) {
  33.                 System.out.print(t);
  34.                 System.out.print(" ");
  35.             }
  36.             System.out.println();

  37.             return 1;
  38.         } else {
  39.             // 当前位置的组合总数
  40.             int count = 0;
  41.             // 循环将当前位置上的元素与其后的元素进行交换,然后递归调用 list 方法
  42.             for (int j = i; j < arr.length; j++) {
  43.                 Main.swap(arr, i, j);
  44.                 count += Main.list(arr, i + 1);
  45.                 Main.swap(arr, i, j);
  46.             }

  47.             // 返回当前位置的组合总数
  48.             return count;
  49.         }
  50.     }

  51.     /**
  52.      * 将数组中的两个元素进行交换
  53.      * @param array 要被交换元素的数组
  54.      * @param i 第一个元素的下标
  55.      * @param j 第二个元素的下标
  56.      */
  57.     public static <T> void swap(final T[] array, final int i, final int j) {
  58.         final T t = array[i];
  59.         array[i] = array[j];
  60.         array[j] = t;
  61.     }
复制代码
示例输出:
  1. 0 1 2 3
  2. 0 1 3 2
  3. 0 2 1 3
  4. 0 2 3 1
  5. 0 3 2 1
  6. 0 3 1 2
  7. 1 0 2 3
  8. 1 0 3 2
  9. 1 2 0 3
  10. 1 2 3 0
  11. 1 3 2 0
  12. 1 3 0 2
  13. 2 1 0 3
  14. 2 1 3 0
  15. 2 0 1 3
  16. 2 0 3 1
  17. 2 3 0 1
  18. 2 3 1 0
  19. 3 1 2 0
  20. 3 1 0 2
  21. 3 2 1 0
  22. 3 2 0 1
  23. 3 0 2 1
  24. 3 0 1 2
  25. 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