根据输入和方法的数量列出所有组合

时间:2018-06-20 08:20:01

标签: java combinations

此问题的摘要版本

我想将HandleMessage0之间的所有可能的数字赋值到n-1变量中。我知道,有v这样的分配,因此我从一个循环开始,该循环生成数字v^n。如何将枚举数从循环转换为实际分配?我对0..(v^n)-1n=4的情况特别感兴趣。

v=7

期望的作业

for (int i = 0; i < Math.pow(v, n); ++i) {
    variable0 = ...;
    variable1 = ...;
    variable2 = ...;
    ...
    variable6 = ...;
}

原始问题

我的目标是为每个输入分配一个方法,并为所有输入获取所有可能的方法组合。

下面是代码(在from this solution的帮助下)

i       variable
        0  1  2  3  4  5  6  
---------------------------
0       0  0  0  0  0  0  0
1       0  0  0  0  0  0  1
2       0  0  0  0  0  0  2
3       0  0  0  0  0  0  3
4       0  0  0  0  0  1  0
...
12000   2  3  2  3  2  0  0
...
16383   3  3  3  3  3  3  3

根据以上代码,共有3种方法(功能A,B,C)和2种输入(名称,电话号码)。因此,所有组合的可能性为3 ^ 2 = 9。 因此,输出如下。

    public static final int FUNCTION_NUMBER = 3;
        public static String functionA() {
            return "A";
        }
        public static String functionB() {
            return "B";
        }
        public static String functionC() {
            return "C";
        }
        public static String callFunction(int function_index) {
            switch (function_index) {
            case 0:
                return functionA();
            case 1:
                return functionB();
            case 2:
                return functionC();
            default:
                throw new IllegalArgumentException("Incorrect value for function_index");
            }
        }

      public static void main(String[] args) {
        for (int i = 0; i <= 8; i++) {

         int name_function_index = i / FUNCTION_NUMBER;
        int phone_no_function_index = i % FUNCTION_NUMBER; }

我的问题是,如果我有4种方法(功能A,B,C,D)和7种输入(名字,姓氏,电话号码,办公室号码,添加,街道,国家/地区)怎么办?因此,组合将为4 ^ 7 =16384。为了获得如下所示的所有可能组合,输入的公式是什么?

  loop name phoneno
      0    A    A
      1    A    B
      2    A    C
      3    B    A
      4    B    B
      5    B    C
      6    C    A
      7    C    B
      8    C    C

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

不断变化的基础使转换变得显而易见

当您拥有 v 变量 var 0 var v-1 并要为它们分配 0 n-1 之间的数字,可以将枚举数 i 转换为基数 n ,然后为每个变量选择一位数字。

示例

您有 v = 3 个变量和n = 2个数字。您知道存在 v n 个可能的分配,并使用计数器 i 进行枚举。通常,人类以小数(以10为底)计数,但是这次,我们以二进制(以2为底)计数。

null

i 二进制表示形式的三位数直接对应于 i 枚举的变量赋值。

将枚举数 i 转换为赋值

要获得分配,我们从基 n 中提取了 i v 位。

假设您有10个基数(正常/十进制) i = 3149 ,并且想要提取其四位数。你会做的

    i     |   Assignment
dec   bin | var2 var1 var0 
----------+----------------
  0   000 |  0    0    0
  1   001 |  0    0    0  
  2   010 |  0    1    0
  3   011 |  0    1    1
  4   100 |  1    0    0
  5   101 |  1    0    1
  6   110 |  1    1    0
  7   111 |  1    1    1

x 位数字的公式为 i / 10 x %10 。 现在,如果基数 n 不同于10,则公式将为 i / n x %n

示例

一个用于 v = 3 n = 4 的小示例程序:

digit0 = i % 10;        // same as i / 1 % 10
digit1 = i / 10 % 10;
digit2 = i / 100 % 10;
digit3 = i / 1000 % 10;

打印

int var0, var1, var2;
int n = 4;
System.out.println("   i | Assignment");
System.out.println("-----+-----------");
for (int i = 0; i < Math.pow(n, 3); ++i) {
    var0 = i % n;           // = i / Math.pow(n, 0) % n 
    var1 = i / n % n;       // = i / Math.pow(n, 1) % n 
    var2 = i / (n * n) % n; // = i / Math.pow(n, 2) % n
    System.out.format("%4d | %2d %2d %2d\n", i, var2, var1, var0);
}

改进

对于更短,更干净,更可扩展的程序,您不应该编写

之类的东西。
   i | Assignment
-----+-----------
   0 |  0  0  0
   1 |  0  0  1
   2 |  0  0  2
   3 |  0  0  3
   4 |  0  1  0
     .
     .
     .
  61 |  3  3  1
  62 |  3  3  2
  63 |  3  3  3

手动。使用数组和循环。