| Comments: |
Хм, по объяснению больше на цикл похоже, чем на рекурсию... А когда "C" разбегается - это break не в том месте воткнули.
Цикл и рекурсия это одно и то же. Вот здесь: http://wiki.c2.com/?RecursionVsLoop люди в основном подтверждают этот факт, но один дядя говорит что в его компании за использование рекурсии увольняют: Far from being elegant, where I work we consider recursion to be the 'goto' of the 21st century. The first use of recursion by a developer gets a verbal warning, second use a written reprimand, and we fire on the third use. wiki.c2.com вообще лучший в мире сайт после lj.rossia.org дядя, что характерно, анон
Вот нифига!
Будешь неаккуратно пользоваться рекурсией - стек переполнится, и пиздец. Особенно если на ассемблере писать. Не, рекурсивные алгоритмы кое-где очень полезны, иной раз без них никак, но вопрос-то не про это.
Рекурсия это скорее не то, что было объяснено, а когда Группа "A" убивает всех свидетелей, потом сама вызывает группу B, чтоб убили ее, группа B сама вызывает группу C. Кончился алфАвит - переполнение стэка.
Стек переполнится если таковой есть, а существуют вычислительные среды где стека нет. Там и переполнения стека не бывает. Erlang в пример.
Стек есть везде (если у тебя x86/AMD64 проц, с памятью соответствующей). Не, если у тебя проц скрученный с НЛО, то там стека может не быть, например, при переполнении данные отправляются в ближайшую к компу черную дыру.
>вычислительные среды >Erlang
Эрланг - не вычислительная среда, а язык программирования. Может там просто хороший сборщик мусора, который не позволяет стеку переполниться. Вообще, такое и для конкретной задачи можно сделать, хоть на C#, сделай себе "сборщик мусора" в конкретном проекте, чтоб проверял, и ловил момент когда пиздец.
> Стек есть везде (если у тебя x86/AMD64 проц, с памятью соответствующей) Ну тут сразу верная поправка, что на x86 архитектуре есть такая абстракция, стека вызовов. Но есть другие архитектуры например. > Эрланг - не вычислительная среда, а язык программирования. Может там просто хороший сборщик мусора, который не позволяет стеку переполниться. Помимо языка программирования, Erlang это еще и реализация интерпретатора (это такой кусок софта, который умеет програму на язык программирования переводить в особой байткод; называется erl), и виртуальной машины (это такой кусок, которая сей особый байткод исполняет; называется beam). Понятно, что без erl и beam Эрланг это всего лишь язык программирования, и никакая не вычислительная среда. Однако, Эрланг без erl и beam используют только филонящие студенты, насколько мне известно, все остальные erl и beam используют. Так вот, виртуальная машина там работает без создания явного стека вызовов как в C# или Java. При этом возможность ходить по цепочке вызовов туда-сюда есть, но используются другие структуры данных, совсем иные накладные расходы на такое хождение. Вот здесь можно почитать больше про подобные среды вычислений: https://en.wikipedia.org/wiki/Register_machine
А, ОК, благодарю за исчерпывающее пояснение по поводу Erlang. Я его в глаза не видел, в руках не держал, не кодил на нем. Один раз мельком посмотрел, хелловорд написал, понял, что IDE говно и пошел ну сами понимаете куда.
Хвостовая рекурсия эквивалентна циклу, а другая - нет.
Если что, речь, вполне конкретно, об общей формуле для n-ного члена последовательности (в данном случае, думаю, чисел Фибоначчи), исходно заданной рекурсивно. Быт простого программиста с этим связан, конечно, но весьма удаленно.
я уж понял, что речь о чистой математике. Но дело в том, что рекурсия - это когда команда A, сама вызывает команду B, чтоб ее расстреляли, и т.д. А если просто A расстреливает B, и т.д., то это цикл. ЗЫ. Оффтоп - вы не могли бы дать отзыв на стихи hronos, он завтра придет ко мне, и ему будет очень приятно услышать ваше мнение. | |