好的,如果您有这样的数字列表(任何大小):
[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
我已经考虑了一段时间了,我知道它是在树形图中构建的,但我不知道如何让它适用于任何大小的列表。
答案 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个数字的配对,如果它只是数字对然后问题变得更简单。