@Doaxan

Почему рекурсивные алгоритмы работают медленнее своих линейных аналогов?

Не буду приводить пример кода, достаточно вспомнить вычисление n-го члена ряда Фибоначчи: F(n) = F(n-1) + F(n-2). И что стоит прочитать, чтобы знать ответ на подобные вопросы?
  • Вопрос задан
  • 1154 просмотра
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Потому что этот алгоритм, будучи рализован в лоб без всяких кэшей и ускорителей, неоптимален! F(n–2) высчитывается дважды, F(n–3) трижды, F(n–4) пять раз, и т.д. по Фибоначчи.

Что читать, сказать не могу (в том издании Кормена, что у меня, маловато), гугли «динамическое программирование». Хотя поначалу поможет и Кормен.

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

ЗЗЫ. Программисты не любят рекурсию по многим причинам. 1. Сложно наладить аварийный стоп. 2. Системный стек ограничен и есть риск переполнения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Mrrl
@Mrrl
Заводчик кардиганов
Совсем не факт, что рекурсивные алгоритмы медленнее. Я только что написал тестовый пример - перебор чисел, все цифры в которых различны. Рекурсивная форма работает примерно на 10% быстрее, чем нерекурсивная, и на её написание ушло в несколько раз меньше времени.
Ответ написан
@SeptiM
Я вижу здесь два разных вопроса.

Первое -- можно сделать два рекурсивных алгоритма. Один запоминает результат и потому работает линейно, другой -- нет и работает экспоненциально. Я когда-то делал простенькую иллюстрацию на эту тему. Алгоритмы считают четырнадцатое число Фибоначчи. На эту тему я бы почитал Кормена в переводе Шеня.

Второй вопрос, если у нас есть два асимптотически одинаковых алгоритма (или нам так кажется). Например, линейный цикл против линейной рекурсии с запоминанием. Здесь никаких прямых ответов не получится. С одной стороны рекурсия кушает ресурсы на стек вызовов, с другой -- запоминание может существенно сократить вычислительные расходы + есть набор трюков, которые позволяют ускорить вычисления с обеих сторон.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы