|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
29.04.2011, 13:02
|
#1
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Рекурсия
А ну-ка срач на тему:
Рекурсия хороша только как алгоритмическая абстракция.
Минусы р:
- исчерпание стека (в цикле мы можем использовать свою реализацию итераторов, поддерживающую Большие значения)
- различное поведение в разных местах вызова (стек может быть уже забит)
- частенько реализация рекурсии в коде выглядит брейнфачно
Пока все примеры использования рекурсии я мог разложить в цикл. Но, я вполне мог что-то упустить - давайте обсудим!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
29.04.2011, 13:05
|
#2
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Рекурсия
Например построение дерева папок на диске... давайте без рекурсии сделайте.
__________________
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо SBJoker за это полезное сообщение:
|
|
29.04.2011, 13:08
|
#3
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Рекурсия
Как и с заливкой полиогна - достаточно списка структур, фиксирующих объекты (состояния обхода).
Рекурсия - простота или примитив? Кто стоит за Джокером?
Узнайте на булке!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
29.04.2011, 13:44
|
#4
|
Дэвелопер
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений (для 1,460 пользователей)
|
Ответ: Рекурсия
Сообщение от impersonalis
А ну-ка срач на тему:
|
хочешь срача - получи
Сообщение от impersonalis
Рекурсия хороша только как алгоритмическая абстракция.
|
еще год назад я бы сказал то же самое. теперь я скажу: "рекурсия - основа всего"
Сообщение от impersonalis
исчерпание стека
|
кури "оптимизация хвостовой рекурсии", рекурсия с аккумуляторами
Сообщение от impersonalis
стек может быть уже забит
|
есть рантаймы, которые автоматически наращивают стек (дада, Эрланг), если его вдруг не хватает
Сообщение от impersonalis
реализация рекурсии в коде выглядит брейнфачно
|
часто код без рекурсии выглядит как говно. а код без паттерн матчинга и подавно всегда выглядит как говно (но это я уже отвлекся).
Сообщение от impersonalis
Пока все примеры использования рекурсии я мог разложить в цикл.
|
думай об этом иначе - цикл это частный (вырожденный) случай рекурсии.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.04.2011, 17:46
|
#5
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Рекурсия
2ffinder: подача мысли нравится - спасибо за коммент.
"оптимизация", "есть такие", "кури то-то" - постараться если (на самом деле - особо и не надо), то можно оправдать использование goto и вообще любой паттерн. Понятно: раз живёт - то иногда-то используется, однако от вычисления факториала через рекурсию - волосы дыбом (код кристально ясен, но автор далёк и от проганья, и от численных методов и подобного матана)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
29.04.2011, 18:32
|
#6
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Рекурсия
вычисления факториала через рекурсию - волосы дыбом
|
ето скорее пример на котором учат дошкольников рекурсии.
любые алгоритмы для работы с деревьями решаются красиво через рекрсию. от решения поиска в бинарном дереве через списки структур фиксирующие объекты волосы встают не меньше чем от решения факториала рекурсией.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
29.04.2011, 18:40
|
#7
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Рекурсия
Грубо говоря каждый инструмент хорош для своих целей. И нет панацеи.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.04.2011, 19:37
|
#8
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Рекурсия
Сообщение от impersonalis
то можно оправдать использование goto и вообще любой паттерн.
|
В эрланге хвостовая рекурсия используется как стандарт/паттерн, большинство методов используют ее для итерации и т.д. Она вообще не использует стек помойму.
http://itc.ua/articles/yazyk_erlang_...cessorov_26721
Начнем с простой задачи вычисления факториала.
...
и запускаем функцию с аргументом, скажем, 20 000 (команда: fac(20 000)).
После небольшой задержки на экран начинает выводиться результат – свыше 70 тыс. цифр. Может быть, на неспециалиста это не произведет особого впечатления, но любой программист, работающий с «обычными» языками, сразу же испытает к Erlang уважение. Во-первых, мы получили результат с невероятной точностью (к примеру, в C# без использования специализированных библиотек «длинной арифметики» программистам доступны целые числа с максимальной 64-разрядной точностью – а это всего каких-то 20 знаков), а во-вторых, он получен рекурсивной функцией с огромной глубиной вложенности – в том же C# неминуемо произойдет переполнение стека.
Но самое поразительное то, что в Erlang вообще нет никаких ограничений ни на длину целых чисел, ни на глубину рекурсивных функций! Единственный ограничивающий фактор – это вычислительные возможности компьютера. Таким образом, программист не должен отвлекаться на такие вопросы, как «Сколько знаков способен хранить используемый тип данных?» или «Cколько уровней вложенности может иметь рекурсивный вызов?».
|
правда в примере не хвостовая рекурсия на сколько я понял.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.04.2011, 20:41
|
#9
|
Дэвелопер
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений (для 1,460 пользователей)
|
Ответ: Рекурсия
Сообщение от impersonalis
"оптимизация", "есть такие", "кури то-то" - постараться если (на самом деле - особо и не надо), то можно оправдать использование goto и вообще любой паттерн.
|
отставить нытьё. С++ уже несколько лет это умеет.
добрый stackoverflow подсказывает как это делать.
так что это вам не это. главное чтобы рекурсия была хвостовой (когда рекурсивный вызов - последний sequence point в функции), а не обычной.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.04.2011, 14:14
|
#10
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Рекурсия
Сообщение от pax
...
|
для вычисления факториала большого аргумента используется гамма-функция.
*** Как и с гото, аргументировать (судя по кол-ву СПС ко 2-ому посту) использование рекурсии вместо цикла средний (! перечитай слово слева 20 раз) программист может только тем, что не хватает воображалки реализовать алгоритм не в лоб.
*кулфейс.жипег*
а то там, наверное, уже понеслось говно по трубам
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:00.
|