Нужна помощь: код с рекурсией (Java). Задача: составить примере, используя - + * их числ массива и чтобы ответ был не больше/меньше отрезка
Имеется задача, которую нужно решить используя рекурсию.
Задача состоит в том, чтобы из числового массива (например [2,12,5,2]) составить примеры - 2+12+5+2, 2-12-5+2, 2+125-2, 212*5-2, используя + - * и чтобы ответ был в промежутке (предположим) [−15; 15].
На выходе должен получиться такой массив (String)
["2-12-5+2=-13",
"2-12+5-2=-7",
"2-12+5+2=-3",
"2-12+5*2=0",
"2+12-5*2=4",
"2+12-5-2=7",
"2+12-5+2=11",
"2*12-5*2=14"]
Пока что у меня нет идей для решения этой задачи, так как только начинаю знакомство с рекурсией. Буду очень благодарна за любую наводку или объяснение.
Имеется также начало метода:
class Rekursia {
public static String[] aritmAvaldisedLõigus(int[] a, int x, int y){
return null;
}
public static void main(String[] args) {
int[] a={2,12,5,2};
int x=-15;
int y=15;
}
}
Ответы (1 шт):
Я сделал пример на C# и только для операций + и -, операцию * добавите сами. Там принцип тот же, но надо немного подумать.
Смысл в том, чтобы просто перебрать все варианты и из них выбрать те, которые в приеделах min-max
Вот так может выглядеть функция
public static void GetAllPermutations(int[] data, int index, string accum, int min, int max, int curr, HashSet<string> ret)
{
if (index >= data.Length)
{
if (curr >= min && curr <= max)
{
accum += "=" + curr;
ret.Add(accum);
}
return ;
}
int number = data[index];
GetAllPermutations(data, index+1, accum + "+" + number, min, max, curr + number, ret);
GetAllPermutations(data, index+1, accum + "-" + number, min, max, curr - number, ret);
}
Вызывать это на C# можно так, на java будет чуть иначе выглядеть - разберетесь
int[] data = new int[] {2,12,5,2};
HashSet<string> ret = new HashSet<string>();
GetAllPermutations(data, 1, data[0].ToString(), -15, 15, data[0], ret);
Console.WriteLine(string.Join(Environment.NewLine, ret));
Вывод на консоль следующий
2+12-5+2=11
2+12-5-2=7
2-12+5+2=-3
2-12+5-2=-7
2-12-5+2=-13