История изменений
Исправление
rtvd,
(текущая версия)
:
И рекурсия и итерация это просто способы описать алгоритм.
Они почти эквивалентны. Циклы эквивалентны хвостовой рекурсии. Циклы с разного рода стеками эквивалентны нехвостовой.
На уровне реализации они выглядят по-разному. Но только выглядят. На низком уровне они выглядят почти одинаково. Просто, скажем, вызов фунции самой собой в нехвостовой рекурсии покладёт данные на традиционный стек вызовов. А если это итерация с явно описанным стеком, то данные будут литься в другое место.
Народ с Сшным синдромом утёнка конечно заметит, что в случае рекурсии у них может сдохнуть софт, исчерпая лимит стека. Но это проблемы реализации языка. В том же Haskell таких жестких ограничений на стек нет и народ этими проблемами не страдает.
Конкретное представление алгоритма обычно зависит от того, что кажется простым для понимания. Вложенный простой цикл лучше выглядит именно как цикл а не как рекурсия. Но при этом некоторые виды рекурсии циклом записать можно, но крайне некрасиво.
Исходная версия
rtvd,
:
И рекурсия и итерация это просто способы описать алгоритм.
Они почти эквивалентны. Циклы эквивалентны хвостовой рекурсии. Циклы с разного рода стеками эквивалентны нехвостовой.
На уровне реализации они выглядят одинаково. Но только выглядят. На низком уровне они выглядят почти одинаково. Просто, скажем, вызов фунции самой собой в нехвостовой рекурсии покладёт данные на традиционный стек вызовов. А если это итерация с явно описанным стеком, то данные будут литься в другое место.
Народ с Сшным синдромом утёнка конечно заметит, что в случае рекурсии у них может сдохнуть софт, исчерпая лимит стека. Но это проблемы реализации языка. В том же Haskell таких жестких ограничений на стек нет и народ этими проблемами не страдает.
Конкретное представление алгоритма обычно зависит от того, что кажется простым для понимания. Вложенный простой цикл лучше выглядит именно как цикл а не как рекурсия. Но при этом некоторые виды рекурсии циклом записать можно, но крайне некрасиво.