Классическая задача перестановки.
Хитрость заключается в том, чтобы передать набор указателей на функции для создания массива операторов (стек, список и т. Д.). В C # и Java указатели функций могут быть реализованы объектами и интерфейсами.
Затем вам необходимо составить список всех различных порядков каждого списка.
Обратите внимание, что вы можете иметь только 3 оператора и что неоднозначно, могут ли некоторые операторы применяться к наборам с обеих сторон по-разному.
Например //
a+b / c - d <> (a+b) / (c-d)
Я не уверен, следует ли учитывать скобки. Если они есть, решение немного сложнее (хотя принципы одинаковы). Просто включите набор скобок и пропустите их тоже (хотя вы также должны учитывать ограничение, что левая скобка должна иметь закрывающую правую скобку). Я не буду освещать это здесь.
Алгоритмы перестановок изобилуют входными данными, поэтому просто выберите один и используйте его для генерации всех различных наборов операторов и чисел.
Чтобы вычислить все результаты, просто выполните итерацию списка операторов, последовательно передав список номеров, и все готово.
Например //
public interface Operator {
public Double calc(int val1, int val2);
}
public class Add implements Operator {
public Double calc(int val1, int val2){
return Double(val1 + val2);
}
}
public class Sub implements Operator {
public Double calc(int val1, int val2){
return Double(val1 - val2);
}
}
public class Mul implements Operator {
public Double calc(int val1, int val2){
return Double(val1 * val2);
}
}
public class Div implements Operator {
public Double calc(int val1, int val2){
return Double(val1 / val2);
}
}
public static Double calc(Operator[] operator_list, int[] value_list)
{
Double ret_val = Double(value_list[0]);
for (int j = 0; j < operator_list.length(); j++){
Operator oper = operator_list[j];
ret_val = oper.calc(ret_val, value_list[j+1]);
}
return ret_val;
}
public static void main(String[] args)
{
int[] values = {1,2,3,4};
Operator add = new Add();
Operator div = new Div();
Operator mul = new Mul();
Operator sub = new Sub();
Operator[] operators = {add, div, sub, mul};
// Calculate from permutation algorithm...
// Don't forget to only generate three values for each permutation!
// out_perm_1 = {add, div, sub};
// out_perm_2 = {div, add, sub};
Operator[] operator_permutations = perm(operators);
// Calculate from permutation algorithm...
// val_perm_1 = {1,2,3,4};
// val_perm_2 = {2,1,3,4};
int[] value_permutations = perm(values);
// Interleave the two lists...
for (int i=0; i < output_permutations.length(); i++)
{
for (int j=0; j < value_permutations.length(); j ++)
{
System.out.println(calc(output_permutations[i], output_permutations[j]));
}
}
}
и т.д ...