好的,如果你有一个数字列表(任意大小),如下所示:
[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
我已经考虑了一段时间了,我知道它是树形结构的,但我就是不知道如何让它适用于任何大小的列表。
发布于 2016-04-06 15:32:24
最简单的方法是使用递归算法,例如:
combination(list)
for(numbers,operators)
combination_list+=number+operation+combination(rest)
return combination_list
您可以使用迭代方法以及任何具有迭代副本的递归算法来完成此操作
发布于 2016-04-06 15:55:07
一个通用的解决方案
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]
*/
}
}
}
}
发布于 2016-04-06 16:20:13
关于这一点背后的一些组合:生成整数列表的所有可能的排序将是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的排序,如果只是成对的数字,那么问题就会变得简单一些。
https://stackoverflow.com/questions/36444106
复制相似问题