В данной задаче требуется сформировать список строк, каждая из которых будет являться вариантом формулы, содержащей аргументы X1, X2, ..., Xmax, знаки арифметических операций и скобки. Этот список затем можно использовать для решений задач типа "расставьте знаки арифметических операций и скобки между заданными числами, чтобы результат вычислений давал заданное число". Функция, решающая данную задачу, может иметь следующий вид:
Функция СписокФормул(От, До)
Перем Результат, Сч, Оп; // для безопасности
Результат = Новый СписокЗначений;
Если От >= До Тогда
Результат.Добавить("X" + От);
Результат.Добавить("( - X" + От + ")")
Иначе
Для Сч = От По До - 1 Цикл
ПравыеЧасти = СписокФормул(Сч + 1, До); // для скорости
Для каждого Слева Из СписокФормул(От, Сч) Цикл
Для каждого Справа Из ПравыеЧасти Цикл
Для Оп = 1 По 3 Цикл
Результат.Добавить("(" + Слева + " " + Сред("+*/", Оп, 1) + " " + Справа + ")")
КонецЦикла
КонецЦикла
КонецЦикла
КонецЦикла
КонецЕсли;
Возврат Результат
КонецФункции // СписокФормул()
Логика тут такая: Цепочка аргументов разными способами разбивается на две части: операцией между первым и вторым, вторым и третьим, третьим и четвертым аргументами и так далее. Варианты формул для левой и правой части цепочки вычисляются рекурсивно. Затем варианты комбинируются, конкатенируясь с тремя (кроме минуса) разными вариантами соединяющих их операций. Скобки обрамляют результат. Когда диапазон номеров аргументов сужается до одного, возвращается два варианта: Xj и ( - Xj). Знак минус обрабатывается особым образом, поскольку минус может быть унарной операцией.
Например, для четырех аргументов функция выдает 2 160 различных формулы, последняя из которых имеет вид:
(((( - X1) / ( - X2)) / ( - X3)) / ( - X4))
Автор: ildarovich
Орфографическая ошибка в конкатенируясь: конкатенируясь
Генератор случайных чисел для диапазона с дробными и отрицательными числами
УдалитьПользовательскийВариантОтчета (БСП)
ПриУдаленииПользовательскихВариантовОтчета (БСП)