Сохранен 31
https://2ch.hk/pr/res/1569181.html
Прошлые домены не функционирует! Используйте адрес ARHIVACH.VC.
24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

В чем преимущество рекурсии перед циклом? Почему

 Аноним 10/01/20 Птн 19:23:09 #1 №1569181 
1577858964318.png
В чем преимущество рекурсии перед циклом? Почему программисты с таким упорством продолжают пихать в курсы по программированию целые разделы, посвященные рекурсиич хотя циклы насного легяе для понимания, и зачастую гораздо менее требовательные к ресурсам?
Аноним 10/01/20 Птн 19:40:12 #2 №1569202 
Например, тебе нужно рекурсивно обойти все файлы в директориях, ты не знаешь сколько там файлов, в таком случае использывание рекурсивного генератора очень удобно
Аноним 10/01/20 Птн 19:48:00 #3 №1569205 
>>1569202
И кто же в 2020 обходит файловую систему? Для каких целей?
Аноним 10/01/20 Птн 19:53:17 #4 №1569207 
>>1569181 (OP)
Рекурсия неявным образом использует стек, поэтому некоторые алгоритмы (как правило это что-то связаное с деревьями) на ней значительно проще и наглядней, чем в итеративном варианте, так как в нем тебе нужно либо явно работать со стеком, либо придумывать стеку равноценую замену, либо искать альтернативный алгоритм более лаконичный при итеративном подходе. Если ты можешь решить задачу итеративно то рекурсия нахуй не нужна. Есть еще разные мемные языки в которых итеративный конструкций может просто не быть, но это отдельный случай.
Аноним 10/01/20 Птн 19:58:41 #5 №1569209 
>>1569181 (OP)
Обход в глубину (который делается рекурсивно) обычно короче и более очевидный.
В нормальных языках нет циклов
Аноним 10/01/20 Птн 19:59:11 #6 №1569210 
>>1569205
Это пример, блеать. Многие задачи, где есть структура данных, похожая на дерево, тупо легче решаются с рекурсией. Но не обязательно дерево.
Аноним 10/01/20 Птн 20:03:52 #7 №1569216 
>>1569205
Ну представь себе любую задачу где нужно обойти граф в глубину.
Допустим тебе нужно написать тест-хелпер, чтобы можно было рекурсивно развернуть любой GraphQL тип по имени.
Аноним 10/01/20 Птн 20:10:58 #8 №1569218 
>>1569209
>В нормальных языках нет циклов
И вакансий
Аноним 10/01/20 Птн 20:16:35 #9 №1569225 
>>1569218
Есть, но мало.Элитно, хули.
Аноним 10/01/20 Птн 20:18:50 #10 №1569229 
>>1569181 (OP)
Циклы не могут заменить рекурсию. Это разные вещи. Часто бывает нужна рекурсия внутри цикла который внутри рекурсит
Аноним 10/01/20 Птн 21:11:54 #11 №1569259 
>>1569229
>Циклы не могут заменить рекурсию
Le proofs?
Аноним 10/01/20 Птн 21:32:53 #12 №1569266 
>>1569181 (OP)
>циклы насного легяе для понимания, и зачастую гораздо менее требовательные к ресурсам?
Не обязательно.
https://ru.wikipedia.org/wiki/Хвостовая_рекурсия
>>1569229
Циклы могут заменить хвостовую рекурсию, а хвостовую рекурсию могут заменить циклы. Не знаю, можно ли любую рекурсию превратить в хвостовую в общем случае, но в ряде конкретных случаев можно.
Аноним 10/01/20 Птн 21:40:57 #13 №1569270 
>>1569266
Вот хвостовая рекурсия как раз уебищная и такая же многословная как обычный цикл.
Аноним 10/01/20 Птн 21:47:12 #14 №1569275 
>>1569202
Но ведь все равно нужно какое-то условие выхода из рекурсии, не? А если есть какое-то условия выхода, то можно и циклом сделать.
Аноним 10/01/20 Птн 21:54:54 #15 №1569278 
>>1569275
То есть ты считаешь, что существует только один вид рекурсии - бесконечная?
Аноним 10/01/20 Птн 21:56:41 #16 №1569280 
>>1569266
В общем случае можно заменить любую рекурсию на цикл. Вопрос лишь в цене.
Аноним 10/01/20 Птн 22:40:39 #17 №1569315 
>>1569278
Ну рекурсия без условия выхода - вечная рекурсия.
Аноним 11/01/20 Суб 00:23:28 #18 №1569364 
>>1569270
Вот поэтому в ФП есть fold, map, filter и прочие функции высшего порядка, которые прячут кишки рекурсии.
Аноним 11/01/20 Суб 01:36:46 #19 №1569380 
>>1569280
Если можно, то чтож авторы компиляторов только хвостовую рекурсию в цикл научились превращать, да и то не всегда?
Аноним 11/01/20 Суб 11:19:36 #20 №1569521 
>>1569181 (OP)
Потому что КРУТО!
Аноним 11/01/20 Суб 16:47:45 #21 №1569988 
>>1569380
Хороший вопрос. Видимо, у такой оптимизации есть далеко идущие последствия. А может, стандарты языков не требуют этого, вот и авторы компиляторов не заморачиваться. Иногда всё же заморачиваются, например GHC (haskell). Но в нормальных языках я с этим не сталкивался.
Аноним 11/01/20 Суб 16:53:06 #22 №1570000 
>>1569181 (OP)
Ни в чем, и работает дольше. Рекурсии только для выебонов и случаев типа хождений по ветвистой хуйне с неизвестной вложенностью.
Аноним 11/01/20 Суб 21:19:38 #23 №1570244 
>>1569988

Все намного проще: заменять не-хвостовую рекурсию на цикл нет никакого смысла, т.к. единственный способ это сделать автоматически - сохранять все аргументы в стек в конце каждой итерации, что и так происходит при рекурсивном вызове функции.
Задача же нахождения для рекурсивного алгоритма итеративного эквивалента, сдается мне, не решаема автоматически.
Аноним 11/01/20 Суб 21:28:55 #24 №1570247 
>>1569988
В GHC оптимизирована только хвостовая рекурсия, не?
Аноним 11/01/20 Суб 22:24:09 #25 №1570293 
>>1570244
> что и так происходит при рекурсивном вызове функции
Разница в том, что при этом используется стек (системный), и его размер сильно ограничен. При переписывании с явным использованием своего стека его можно хотя бы ресайзнуть. Наверное, автоматически это не оптимизируют всё же потому, что при бесконечной рекурсии лучше уж программа быстро упадёт, чем сначала сожрёт всю оперативку.

>>1570247
Насколько я понимаю, не только хвостовая. По крайней мере, я когда-то давно это дело тыкал, и мне не удалось добиться переполнения стека. А это должно быть достаточно легко, рекурсия там на каждый чих юзается.
Аноним 11/01/20 Суб 22:36:15 #26 №1570305 
>>1570247
Ленивость в каком то смысле в том числе оптимизирует рекурсию, не давая выполнять некоторые вызовы, если от них не зависит общий результат.
>>1570293
Я погуглил, в Хаскелле вообще не используется стэк в общем случае.
wiki.haskell.org/Stack_overflow
Аноним 11/01/20 Суб 22:40:14 #27 №1570310 
>>1570305
>Я погуглил, в Хаскелле вообще не используется стэк в общем случае.
Ну т.е. call stack, так то там какие то стэки есть.
Аноним 12/01/20 Вск 09:59:38 #28 №1570557 
>>1570305
Ленивость это ленивость, она с оптимизацией рекурсии никак не связана. Ты любом языке можешь сделать бесконечный стрим с рекурсией, но если ты запустишь его на достаточно большой последовательности можно получить stack overflow, о чем и пишется в статье по твоей ссылке.

When GHC is evaluating a thunked expression it uses an internal stack. This inner stack for thunk evaluation is the one that can overflow in practice.

First, read Performance/Accumulating parameter. If you are not writing your code tail-recursively, then that is why you are getting stack overflows.
Аноним 12/01/20 Вск 10:29:37 #29 №1570567 
>>1570000
> и случаев типа хождений по ветвистой хуйне с неизвестной вложенностью.
Ну то есть всего лишь для реализации быстрой сортировки и хуевой тучи других элементарных и неочень алгоритмов.
Аноним 12/01/20 Вск 12:36:13 #30 №1570637 
>>1570567
Никто кроме борщехлёбов и не говорил, что "рекурсия - это лучшая вещь всех времён и народов, всегда используйте её вместо цикла".
Аноним 12/01/20 Вск 21:06:03 #31 №1571057 
>>1570557
Ну хорошо.
comments powered by Disqus