C/C++

В чем прикол рекурсии, если существуют циклы?

Я новичок и ума не приложу, для чего может пригодится рекурсия, если эту же самую функцию выполнит любой цикл.
Попробуйте с помощью циклов обойти содержимое системного диска на своём компьютере и узнаете в чём прикол.
ИР
Илья Рогов
66 562
Лучший ответ
Renat Saidov Да собственно проблемы нет. Крайне схоже с алгоритмом закраски замкнутой области в условном паинте. Меняем рекурсию на ручной стек - и проблемы нет. Псевдокод:

while(stack is not empty):

var currFolder = stack.Pop();
stack.PushMany(currFolder.GetAllSubfolders());
foo(stack.GetAllFiles()); // do action with files
это очень возможно что это вам никогда в жизни не пригодится...
Александр Швец
Александр Швец
79 553
Вы можете сделать цикл двойной вложенности, тройной вложенности и любой другой фиксированной вложенности. А как вы будете делать цикл, для которого число уровней вложенности наперед не известно и определяется во время работы программы?
Задача "Ханойские башни", например, при помощи рекурсии решается а одну строку.
А при помощи циклов надо городить длинный огород! :)))
Краткий и естественный вид записи выражения, начиная с тех же чисел Фибоначчи
Ну ты только посмотри, как с помощью рекурсии код алгоритмов можно сильно сократить, а некоторые записать в одну строчку. Например, все содержание алгоритма Евклида умещается в одну строчку в Си (опуская проверку порядка записи аргументов)
return(b) ? gcd_rec(b, a % b) : a;
Не то чтобы алгоритм сам по себе большой, он простой и короткий, но так выходит еще короче.
Ну например самый быстрый алгоритм сортировки, который так и называется "быстрая сортировка" выполняеся за время логарифм от числа элементов. Там принцим в том что в массиве берется какая-нибудь опорная точка, массив делится на две части относительно ее, потом снова делится, снова делится и так до тех пор пока не отсортируется. Сделать это по моему можно только рекурсией. Циклами, точно не знаю, но вряд ли выйдет.
Сортировки циклами устроены так что есть главный цикл, в нем еще один цикл, который перебирает элементы. Время выполнения получается квадратичным. То есть рекурсия отсортирует массив из 16 элементов за количество шагов - логарифм 16 по основанию 2, то есть за 4 шага. А квадратичная сортировка циклами будет это делать за количество шагов n в квадрате, то есть для 16 будет около 256 шагов
Альберт Пигонин Временная сложность не от самого факта использования рекурсии/цикла зависит, а от принципа работы алгоритма.
Сортировки, использующие рекурсию, можно написать и без рекурсии
Рекурсия позволяет создать ветвление, ведь функция может быть вызвана в себе несколько раз. А цикл по сути линейный.
Иногда некоторую задачу проще реализовать спомощью рекурсии и поддерживать его, вот поэтому и нужны рекурсии.

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

У рекурсии есть свои минусы и плюсы.

Минусы: некоторые компиляторы или интерпретаторы языков программирования, ограничивают количество вызовов функций, например в JavaScript браузером количество вызовов ограничено до 100 тысяч, после чего может выйти ошибка переполнения стека. Рекурсия также требует больше памяти, т.к. каждый вызов функции сохраняется в памяти, до завершения работы самой функции.

Плюсы: Рекурсия позволяет программисту быстрее реализовать определенную задачу, чем пытаться делать её на циклах, это позволяет программисту сэкономить время, но за это приходится платить минусами и ограничениями.
Просто есть задачи, в которых решение сделанное рекурсией невозможно заменить циклом. Жаль ток, что мне примеры в голову сейчас не лезут. А так, если есть возможность заменить рекурсию на цикл, это обязательно сделают. Есть еще данные рекурсивные, тоже веселая вещь
Сева Петров
Сева Петров
1 570
Renat Saidov Любую рекурсию можно заменить циклом.