Рекурсия - как мы все знаем - это одна из тех проблем, когда мыслят вокруг, как будто достигают «вехи» в вашем плавании.
Но когда дело доходит до фактического использования его в реальных задачах - знания механизма рекурсии недостаточно, нужно также понимать природу проблем, для которых рекурсия является наиболее подходящим решением.
Итак, мой вопрос заключается в следующем ...
- Каковы "шаблоны проблемы", которые требуют решения рекурсии
- является ли рекурсия формой стратегии «разделяй и властвуй» или формой «повторного использования кода», или же сама является шаблоном проектирования
- Можете ли вы привести пример реальной проблемы, когда рекурсия приходит на ум как немедленное решение?
-- ОБНОВИТЬ --
многие ответы ссылаются на «реальные проблемы» как обход дерева, факториал и т. д. Я бы предпочел «РЕАЛЬНЫЕ реальные проблемы» - позвольте мне привести вам пример ...
У нас был БОЛЬШОЙ кусок текста (около 30 МБ текста в виде связанного списка structs
), и нам нужно было создать его индекс для полнотекстового поиска. Нам нужно было сохранить весь индекс в памяти и переиндексировать текст каждые 10 минут.
Каждые 10 минут мы сравнивали весь текст (два связанных списка, строка за строкой) с вновь созданным фрагментом текста, чтобы увидеть, какая строка была изменена, и затем мы переиндексируем только эту строку - таким образом. мы могли бы избежать необходимости переиндексировать ВЕСЬ текст. Помните - нам нужно было найти точки различия между двумя связанными списками по 30 МБ.
Один из моих коллег придумал фантастическую программу, которая использовала HEAVY-рекурсию для сравнения линий - и затем собирала позиции, в которых патроны различались в массиве - да, я знаю, это звучит странно - как рекурсия может помочь здесь - но это сделал.
Дело в том, как он мог понять, что эту проблему можно решить с помощью интенсивного использования рекурсии?