Каковы преимущества и недостатки рекурсии?

с уважением, используя рекурсию нерекурсивных методов в алгоритмах сортировки или, если на то пошло, любой алгоритм, каковы его плюсы и минусы?

8 ответов


по большей части рекурсия медленнее и занимает больше места в стеке. Основным преимуществом рекурсии является то, что для таких задач, как обход дерева, она делает алгоритм немного проще или более "элегантным". Проверьте некоторые из сравнений:

ссылке


рекурсия означает, что функция вызывает повторно

Он использует системный стек для выполнения своей задачи. Как стек использует подход LIFO и когда функция называется контролируемой, перемещается туда, где определена функция, которая хранится в памяти с некоторым адресом, этот адрес хранится в стеке

во-вторых, это снижает сложность программы.

хотя немного не по теме, немного связано. Должны прочитать. : рекурсия против итерации


все алгоритмы могут быть определены рекурсивно. Это значительно облегчает визуализацию и доказательство.

некоторые алгоритмы (например,Функция Аккермана) невозможно (легко) указать итеративно.

рекурсивная реализация будет использовать больше памяти, чем цикл если оптимизация хвостового вызова невозможно выполнить. Хотя итерация может использовать меньше памяти, чем рекурсивная функция, которая не может быть оптимизирована, у нее есть некоторые ограничения выразительная сила.


Я лично предпочитаю использовать итеративную над рекурсивной функцией. Особенно, если ваша функция имеет сложную/тяжелую логику и количество итераций велико. Это потому, что с каждым рекурсивным вызовом стек вызовов увеличивается. Это может привести к сбою стека, если операции слишком велики, а также замедлить процесс.


для начала:

плюсы:

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

плюсы:

  • рекурсивные методы часто вызывают исключение StackOverflowException при обработке больших наборов. Однако рекурсивные циклы не имеют этой проблемы.

любой алгоритм, реализованный с помощью рекурсии, также может быть реализован с помощью итерации.

почему не использовать рекурсию

  1. это обычно медленнее из-за накладных расходов на поддержание стека.
  2. он обычно использует больше памяти для стека.

почему to использовать рекурсию

  1. рекурсия добавляет ясность и (иногда) уменьшает время, необходимое для написания и отладки кода (но не обязательно уменьшите требования к космоса или скорость исполнения).
  2. уменьшает сложность времени.
  3. лучше работает при решении задач на основе древовидных структур.

например, проблема Ханойской башни легче решается с помощью рекурсии, а не итерации.


экспрессивность

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

неизменяемости

итеративные решения часто полагаются на различные временные переменные, что затрудняет чтение кода. Этого можно избежать с помощью рекурсии.

производительность

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


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