Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 29.04.2011, 13:02   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Рекурсия

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

Пока все примеры использования рекурсии я мог разложить в цикл. Но, я вполне мог что-то упустить - давайте обсудим!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 29.04.2011, 13:05   #2
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Рекурсия

Например построение дерева папок на диске... давайте без рекурсии сделайте.
__________________
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо SBJoker за это полезное сообщение:
ABTOMAT (29.04.2011), impersonalis (29.04.2011), Reizel (29.04.2011), Reks888 (29.04.2011)
Старый 29.04.2011, 13:08   #3
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Рекурсия

Как и с заливкой полиогна - достаточно списка структур, фиксирующих объекты (состояния обхода).
Рекурсия - простота или примитив? Кто стоит за Джокером?
Узнайте на булке!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 29.04.2011, 13:44   #4
ffinder
Дэвелопер
 
Аватар для ffinder
 
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений
(для 1,460 пользователей)
Ответ: Рекурсия

Сообщение от impersonalis Посмотреть сообщение
А ну-ка срач на тему:
хочешь срача - получи
Сообщение от impersonalis Посмотреть сообщение
Рекурсия хороша только как алгоритмическая абстракция.
еще год назад я бы сказал то же самое. теперь я скажу: "рекурсия - основа всего"
Сообщение от impersonalis Посмотреть сообщение
исчерпание стека
кури "оптимизация хвостовой рекурсии", рекурсия с аккумуляторами
Сообщение от impersonalis Посмотреть сообщение
стек может быть уже забит
есть рантаймы, которые автоматически наращивают стек (дада, Эрланг), если его вдруг не хватает
Сообщение от impersonalis Посмотреть сообщение
реализация рекурсии в коде выглядит брейнфачно
часто код без рекурсии выглядит как говно. а код без паттерн матчинга и подавно всегда выглядит как говно (но это я уже отвлекся).
Сообщение от impersonalis Посмотреть сообщение
Пока все примеры использования рекурсии я мог разложить в цикл.
думай об этом иначе - цикл это частный (вырожденный) случай рекурсии.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (29.04.2011)
Старый 29.04.2011, 17:46   #5
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Рекурсия

2ffinder: подача мысли нравится - спасибо за коммент.
"оптимизация", "есть такие", "кури то-то" - постараться если (на самом деле - особо и не надо), то можно оправдать использование goto и вообще любой паттерн. Понятно: раз живёт - то иногда-то используется, однако от вычисления факториала через рекурсию - волосы дыбом (код кристально ясен, но автор далёк и от проганья, и от численных методов и подобного матана)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 29.04.2011, 18:32   #6
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Рекурсия

вычисления факториала через рекурсию - волосы дыбом
ето скорее пример на котором учат дошкольников рекурсии.

любые алгоритмы для работы с деревьями решаются красиво через рекрсию. от решения поиска в бинарном дереве через списки структур фиксирующие объекты волосы встают не меньше чем от решения факториала рекурсией.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
impersonalis (29.04.2011), Mr_F_ (29.04.2011), SBJoker (29.04.2011)
Старый 29.04.2011, 18:40   #7
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Рекурсия

Грубо говоря каждый инструмент хорош для своих целей. И нет панацеи.
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (30.04.2011)
Старый 29.04.2011, 19:37   #8
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (30.04.2011)
Старый 29.04.2011, 20:41   #9
ffinder
Дэвелопер
 
Аватар для ffinder
 
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений
(для 1,460 пользователей)
Ответ: Рекурсия

Сообщение от impersonalis Посмотреть сообщение
"оптимизация", "есть такие", "кури то-то" - постараться если (на самом деле - особо и не надо), то можно оправдать использование goto и вообще любой паттерн.
отставить нытьё. С++ уже несколько лет это умеет.
добрый stackoverflow подсказывает как это делать.
так что это вам не это. главное чтобы рекурсия была хвостовой (когда рекурсивный вызов - последний sequence point в функции), а не обычной.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (30.04.2011)
Старый 30.04.2011, 14:14   #10
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Рекурсия

Сообщение от pax Посмотреть сообщение
...
для вычисления факториала большого аргумента используется гамма-функция.
***
Как и с гото, аргументировать (судя по кол-ву СПС ко 2-ому посту) использование рекурсии вместо цикла средний (! перечитай слово слева 20 раз) программист может только тем, что не хватает воображалки реализовать алгоритм не в лоб.
*кулфейс.жипег*
а то там, наверное, уже понеслось говно по трубам
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 16:00.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com