2013-05-11 2 views
-1

Я пытаюсь решить различные головоломки рекурсии, и одна проблема, с которой я столкнулся, - это генератор уравнений. Я не могу понять, как решить эту проблему. Заявление о проблеме выглядит следующим образом.Создать действующее уравнение из четырех чисел, поместив арифметические операторы

Вам предоставляется 4-значное число. Например, 1234. Теперь у вас есть выведите уравнение из него, поставив арифметические операторы и знак , равный знаку между цифрами без изменения порядка чисел.

  1. 1 = 2 + 3-4
  2. 1-2 = 3-4
  3. 12 = 3 * 4
  4. 12/3 = 4
  5. 1^2 + 3 = 4

Я хотел бы написать функцию, которая генерирует первое уравнение, которое оно может найти и вернуть в C# или Java. Может ли кто-нибудь дать подсказку или указатель относительно того, как решить эту проблему рекурсивно?

+0

Покажите нам, что вы сделали, и что не работает для вас. Пойдите сначала. – Rots

+0

@ Розы Я не могу решить, с чего начать на самом деле. Я буду продолжать пытаться, отредактирую вопрос, как только смогу добиться определенного прогресса. Спасибо за предложение в любом случае. – Buddha

+0

выглядит как некоторые люди имеют некоторые идеи для вас ниже. Удачи! – Rots

ответ

2

расколоть задачи в трех различных подзадач:

  • генерировать все комбинации операторов (кажется что числа всегда находятся в одном и том же порядке. Рассмотрим = как оператор)
  • Оцените одну комбинацию операторов, чтобы определить, истинно или нет
  • Отфильтровать все комбинации с использованием оценки

См. this для генерирования комбинаций. Наконец, после того, как у вас также есть функция оценки ...

var results = GetCombinations().Where(comb => Evaluate(nums, comb)).ToList(); 

Обратите внимание на все, что я намеренно краток, чтобы избежать ложки кормлению.

+0

Спасибо за предложение. – Buddha

1

Подсказка: Вы можете:

  • генерировать строки, а затем пытаться анализировать и оценивать их как уравнения, чтобы увидеть, если они являются синтаксически действительными и «истинным», или

  • генерировать и оценивать уравнение деревья, оценивайте их, а затем не разбирайте их в Строках, если они «истинны».

Любой подход имеет проблемы ... но открытие и их решения ваша работа :-)

+0

Никогда не слышал о деревьях уравнений. Спасибо, спасибо. – Buddha

+0

Дерево уравнений - это просто дерево, представляющее уравнение. Он аналогичен дереву выражений ... или представлению дерева разбора любого языка программирования. –

1

Мой старый учитель математики играл в эту игру с ежедневной датой. Веселая.

В любом случае, ключ должен последовательно проходить все возможные уравнения.(Я знаю, что это рекурсивная проблема, но выслушай меня)

Что-то вроде этого:

recursivefunction (последовательность):

если действительный обратный последовательность

foreach operator position 
    foreach operator 
     recursivefunction(sequence with new operator) 
1

Некоторые советы для вас:

  1. Перечислить все уравнения. После этого шага вы получите «1 + 2 = 3 + 4», «1 = 2 + 3-4», «1 + 2-3^4» и т. Д.
  2. Удалить все недействительные уравнения. После этого шага вы получите «1 + 2 = 3 + 4», «1 = 2 + 3-4» и т. Д.
  3. Оценка всех действительных уравнений и их равен или нет. После этого шага, вы получите «1 = 2 + 3-4» и т.д.
+0

Спасибо, Саякис. Большинство ответов схожи. Я сделаю это. – Buddha

+0

@Buddha Итак, проголосуйте меня за плз ...? – Sayakiss

+0

Зачем генерировать ненулевые уравнения? Почему бы просто не генерировать только действительные уравнения? –

4

Может ли один дать подсказку или указатель того, как решить эту проблему?

Да. В дополнение ко всем другим хорошим предложениям здесь: Прочитайте «Как решить его» Поля. В книге рассказывается о том, как решать математические задачи, но большая часть рекомендаций там применима к проблемам программирования.

http://en.wikipedia.org/wiki/How_to_Solve_It

Предположение о Полна, который наилучшим образом относится к вашей проблемы решить более простую задачу. Например, можете ли вы решить эту проблему?

Вам предоставляется 4-значное число. Например, 1234. Теперь вам нужно сделать уравнение из него, поставив знак равенства между цифрами без изменения порядка чисел. Например:

1=234 
12=34 
123=4 

Конечно все эти уравнения являются ложными, но ясно, если вы не можете решить проблему генерации ложных уравнений без каких-либо операторов, то вы не можете решить сложнее проблему создания истинных уравнений с операторы. Решите более легкую проблему, и это даст вам представление о том, как решить большую проблему.

+0

Спасибо, что предложили название книги. Как я уже сказал, большинство решений, кроме одного, основаны на грубой силе. Я на самом деле пытаюсь решить эту проблему рекурсивно. Рекурсия - это не моя область силы, из-за которой я собираю проблемы, которые могут быть рекурсивно решены и сражаться с ними. – Buddha

+0

@Buddha: Я действительно не вижу, как эта проблема поддается рекурсивному решению; Вы можете объяснить? Каков основной случай и что такое рекурсивный случай? –

+0

Я думаю, что вы спрашиваете не того человека :) Я на самом деле пытаюсь найти ответы на эти точные вопросы. Этот вопрос, который я получил, представлен в одной презентации из одной из университетских лекций (я не из этого класса) пару лет назад, где они задавали проблемы, которые все труднее решать с рекурсией. Я решил 6 из них, я немой ударил по этой проблеме. Я отвечу, когда найду. Базовый случай может быть, когда мы нашли уравнение, которое можно успешно оценить. Я должен найти рекурсивный случай. – Buddha

Смежные вопросы