Ответ 1
По большей части рекурсия медленнее и занимает больше стека. Основным преимуществом рекурсии является то, что для таких проблем, как обход дерева, он делает алгоритм немного проще или более "изящным". Проверьте некоторые из сравнений:
Что касается использования рекурсии по нерекурсивным методам в алгоритмах сортировки или, если на то пошло, любого алгоритма, каковы его плюсы и минусы?
По большей части рекурсия медленнее и занимает больше стека. Основным преимуществом рекурсии является то, что для таких проблем, как обход дерева, он делает алгоритм немного проще или более "изящным". Проверьте некоторые из сравнений:
Рекурсия означает повторную вызов функции
Он использует системный стек для выполнения этой задачи. Поскольку стек использует подход LIFO и когда функция называется управляемой, она перемещается туда, где определена функция, которая хранится в памяти с некоторым адресом, этот адрес хранится в стеке
Во-вторых, это уменьшает временную сложность программы.
Хотя бит не по теме, немного связан. Должен прочитать.: Рекурсия против итерации
Все алгоритмы могут быть определены рекурсивно. Это значительно облегчает визуализацию и доказательство.
Некоторые алгоритмы (например, Ackermann Function) не могут (легко) быть указаны итеративно.
Рекурсивная реализация будет использовать больше памяти, чем цикл, если оптимизация хвостовых вызовов не может быть выполнена. Хотя итерация может использовать меньше памяти, чем рекурсивная функция, которая не может быть оптимизирована, она имеет некоторые ограничения в ее выразительной мощности.
Я лично предпочитаю использовать итеративную над рекурсивной функцией. Особенно, если вы работаете с сложной/тяжелой логикой, и количество итераций велико. Это связано с тем, что с каждым рекурсивным вызовом стек вызовов увеличивается. Это может привести к сбою стека, если вы слишком велики, а также замедлите процесс.
Чтобы начать:
Плюсы:
Минусы:
Любой алгоритм, реализованный с использованием рекурсии, также может быть реализован с использованием итерации.
Например, проблему Башни Ханоя легче решать с помощью рекурсии, а не итерации.
Большинство проблем естественно выражается рекурсией, такой как Fibonacci, сортировка слияний и быстрая сортировка. В этом отношении код написан для людей, а не для машин.
Итерационные решения часто полагаются на переменные временные переменные, которые затрудняют чтение кода. Этого можно избежать при рекурсии.
Рекурсия не совместима со стеклом. Stack может переполняться, когда рекурсия плохо разработана или оптимизация хвоста не поддерживается.
Возникает некоторая ситуация, когда вам придется отказаться от рекурсии в проблеме, где рекурсия представляется вам в ваших интересах, это связано с тем, что для проблем, в которых ваша рекурсия должна произойти тысячи раз, это приведет к ошибке stackoverflow, хотя ваш код не застрял в бесконечной рекурсии. Большинство языков программирования ограничивают количество вызовов стека, поэтому, если ваша рекурсия выходит за пределы этого предела, вы можете не использовать рекурсию.
Мы должны использовать рекурсию в следующих сценариях:
Рекурсия спасет несколько обходов. И это будет полезно, если мы сможем разделить распределение стека следующим образом:
int N = 10;
int output = process(N) + process(N/2);
public void process(int n) {
if (n==N/2 + 1 || n==1) {
return 1;
}
return process(n-1) + process(n-2);
}
В этом случае только половина стеков будет выделено в любой момент времени.