Это интересная проблема. Здесь есть несколько разных вещей. Одна из проблем заключается в том, как описать последовательность операций и операндов, которые входят в арифметическое выражение. Использование скобок для установления порядка операций довольно беспорядочно, поэтому вместо этого я предлагаю думать о выражении как стек операций и операндов, например - 4 4
для 4-4, + 4 * 4 4
для (4 * 4) +4, * 4 + 4 4
для (4 + 4)) * 4 и т. Д. Это как обратная польская нотация на калькуляторе HP. Тогда вам не нужно беспокоиться о круглых скобках, поскольку структура данных для выражений поможет ниже, когда мы создадим более крупные и большие выражения.
Теперь перейдем к алгоритму построения выражений. Динамическое программирование в этой ситуации не работает, на мой взгляд, потому что (например) для построения некоторых чисел в диапазоне от 0 до 100 вам может потребоваться временно выйти за пределы этого диапазона.
Лучшим способом концептуализации проблемы, я думаю, является как первый поиск по ширине (BFS) на графике. Технически граф будет бесконечным (все положительные целые числа или все целые числа или все рациональные числа, в зависимости от того, насколько вы хотите получить), но в любой момент у вас будет только конечная часть графика. Уместная структура данных с разреженным графиком.
Каждый узел (число) на графике имеет связанный с ним вес, минимальное количество 4, необходимое для достижения этого узла, а также выражение, которое достигает этого результата. Сначала вы начинаете только с узла (4), с номером 1, связанным с ним (требуется 4, чтобы сделать 4), и простым выражением «4». Вы также можете бросить (44) весом 2, (444) весом 3 и (4444) с весом 4.
Чтобы создать более крупные выражения, примените все различные операции, которые у вас есть к этим начальным узлам.Например, унарное отрицание, факторный, квадратный корень; двоичные операции, такие как * 4
в нижней части вашего стека для умножения на 4, + 4
, - 4
, / 4
, ^ 4
для возведения в степень, а также + 44
и т. д. Вес операции - это число 4s, необходимое для этой операции; унарные операции имели бы вес 0, + 4
имел бы вес 1, * 44
имел бы вес 2 и т. д. Вы бы добавили вес операции к весу узла, на котором он работает, чтобы получить новый вес, например, + 4
на узле (44) с весом 2, а выражение «44» приведет к новому узлу (48) с весом 3 и выражению «+ 4 44». Если результат для 48 имеет лучший вес, чем существующий результат для 48, замените этот новый узел на (48).
При применении функций вам придётся использовать определенный смысл. факторный (4444) был бы очень большим числом; было бы разумно установить домен для вашей факториальной функции, который помешал бы получить слишком большой результат или выйти за рамки. То же самое с функциями типа/4; если вы не хотите иметь дело с дробями, скажите, что несимволы 4 находятся за пределами области/4 и в этом случае не применяют оператор.
Результирующий алгоритм очень похож на алгоритм Дейкстры для вычисления расстояния на графике, хотя и не совсем то же самое.
4/4, (4 + 4)/4, (4 + 4 + 4)/4 ... –
@GiorgiNakeuri - у вас есть только цифра «4» 4 раза ... –
I.E. Я могу использовать только 4 цифры пользователя 4 раза? Могу ли я использовать 3 4s или 2 4s? –