如何获得(列表中的数字)和(简单的数学运算符)

时间:2016-04-06 07:19:43

标签: for-loop combinatorics

好的,如果您有这样的数字列表(任何大小):

[5, 7] (It's short so i can type all the combinations)

我想要一个循环,返回一个像这样的组合列表:

5+7
5-7
5*7
5/7
7+5
7-5
7*5
7/5

我已经考虑了一段时间了,我知道它是在树形图中构建的,但我不知道如何让它适用于任何大小的列表。

3 个答案:

答案 0 :(得分:0)

最简单的方法是使用递归算法,如:

combination(list)
  for(numbers,operators)
     combination_list+=number+operation+combination(rest)
  return combination_list

你可以通过迭代方法来实现,任何递归算法都有迭代对应

答案 1 :(得分:0)

一般解决方案

void operations(int[] numbers){
    int size =  //determine the number of elements in the array
        for(int i=0; i < size; i++){
            for (int j = 0; j < size;j++){
                if( i !=j){
                /*do all the operations 
                      numbers[i] + numbers[j] 
                      numbers[i] - numbers[j] 
                      numbers[i] * numbers[j] 
                      numbers[i] / numbers[j] 
            */
                }
            }
        }  
   }

答案 2 :(得分:0)

关于第一个背后的组合学的一点点: 生成整数列表的所有可能排序将为N!组合,并在每个组合上,然后它们之间的所有可能的运算符选择,[运算符的数量] ^ [整数之间的间隙数],所以4 ^(n-1) 将这两个数字乘以您将拥有的列表总数:N!*(4 ^(n-1))

只需在列表中添加第三个整数就可以获得96种可能的组合,1536种情况下可以获得第四个,我相信你知道这会快速增长。

(我也忽略了这样一个事实:如果你的列表有重复的整数,你不需要创建该列表的重复排列,所以以上所有只适用于唯一整数列表)

我认为我尝试这种方式的方法是先创建N个整数的所有排列的列表,并分别列出所有N-1个多个运算符的列表。然后使用一对foreach循环将它们组合成一个更大的列表。

List<Integer[]> orderings = //a bunch of arrays each one being a unique ordering of all integers in the inital listing
List<Character[]> selections = //a bunch of arrays each one being a unique selection of the 4 operators
List<String> combinations = new ArrayList<String>();
for(Integer[] order : orderings) {
    for(Character[] selection : selections) {
        //now combine order (numbers) and selection(operators) alternating between indexes
        String combination = order[0].toString();
        for(int i = 0; i < selection.length; i++) {
            combination += selection[i].toString() + order[i+1].toString();
        }
        combinations.add(combination);
    }
}

生成数字的排列就像找到一副牌的所有可能的排序一样,这是一个问题,应该在堆栈溢出的其他地方有很多容易找到的解决方案,并且找到所有选择的运算符并不多更难。

编辑:哦,我刚才意识到我不确定你是否只是特别想要成对数字,所以3个数字的列表只会输出任意两个整数的配对,而不是包含所有3个数字的配对,如果它只是数字对然后问题变得更简单。