Я родом из физики, и, следовательно, много математики. Я нахожу легко обнаружить проблемы, хорошо подходящие для рекурсивного / динамического программирования, находя сходства с доказательством по индукции .
В доказательстве по индукции у вас есть две части:
- Вы доказываете, что если что-то верно для итерации N, это также верно для итерации N + 1
- Вы доказываете, что это верно для итерации 1
В рекурсивном программировании / динамическом программировании:
- вы определяете условие выхода (например, вы жестко связываете решение для итерации 1)
- Вы рассчитываете решение для итерации N с учетом решения для итерации N-1
Итак, как ответили другие, это вопрос опыта и выбора подсказок, но вы можете повторно использовать другие навыки, чтобы направлять вас. После этого вам нужно всегда иметь две части, которые я упомянул: если нет, то это не сработает.
Например, чтобы сгенерировать все перестановки набора:
- условие выхода: если у вас есть только один элемент, верните его
- рекурсия: перестановки набора из N элементов - это N наборов перестановок, которые вы получаете, выбирая каждый элемент и комбинируя их со всеми N-1 наборами (многих) перестановок подмножества, которые вы получаете, удаляя элемент.