саша
ну а теперь посмотри как устроены списки в хаскеле)
так ну первый рекурсивный вызов у нас заюзает ~ n + (n - n / 2) памяти, вторая ~ n + (n - n / 2) + (n - n / 4), третья ~ n + (n - n / 2) + (n - n / 4) + (n - n / 8). Снова n * log n. UPD: на каждой глубине рекурсии будет заюзано на самом деле ~ n + n * k / 2, где k глубина рекурсии. В общем-то это ничего не меняет, расход по памяти остаётся O(n * log n)
Мерль
что значит "скорее всего"? оно либо будет либо не будет и асимптотической сложности это имеет прямое отношение
Неа Учитывая что: - у нас работает оптимизирующий компилятор - сборщик мусора - переупорядочивание инструкций - кэширование данных - кэширование инструкций - бранч предиктор - предиктор подкачки памяти - куча магии - всё это работает внутри ОС нереального времени Я бы вообще не стал бы делать никаких сильных заявлений, особенно без экспериментов
Мерль
уже написали - sort.Slice
Она написана через рекурсию
Мерль
)
Pawel
Она написана через рекурсию
но не такую как в хакеле, без потребления стека
Pawel
Она написана через рекурсию
можно было бы и через циклы перепиать, мало что изменилось бы
David
ого, (не хвостовая) рекурсия без потребления стека, это как?
Мерль
но не такую как в хакеле, без потребления стека
С чего ты взял? Оптимизации хвостовой рекурсии в го нет, а это даже не хвостовая
Мерль
)
David
ну я думаю, тут речь шла о том что сам список на стек не копируется
David
но я все еще жду пояснений про аморт. сложность 🙂
Pawel
С чего ты взял? Оптимизации хвостовой рекурсии в го нет, а это даже не хвостовая
оно минизерное на столько, что должно хватить на гипер гигансткие массивы. Там только указатель на функцию и индексы передаются в рек. функцию
Мерль
И да, кто-то, не помню кто, говорил недавно что никто нормальный не будет использовать рекурсию, что всегда лучше переписать
Dorian
Весело у вас тут
Pawel
Это всё результаты бенчмарков иди измерений или твои догадки? Замеры в студию
это кстати можно. хаскильный квиксорт на значительно меньшем массиве упадёт с SO чем гошный
Dorian
Проснулся в чате хаскеля
Мерль
Ну так я не понял, сортировка с рекурсией — это харам, или всё таки так пайк завещал и нам велел?
Olzhas
рекурсия по памяти же неочень
Диёр
рекурсия по памяти же неочень
Компилятор должен разрулить хвостовую рекурсию
David
это кстати можно. хаскильный квиксорт на значительно меньшем массиве упадёт с SO чем гошный
хаскельный библиотечный квиксорт ничем не хуже гошного и конечно же не жрет стек
Алексей
рекурсия по памяти же неочень
Да вообще-то нормально по памяти
Диёр
не все могут это сделать
Не проблема тех, кто может
David
не все могут это сделать
ага, я даже знаю один популярный язык без этой оптимизации 🙂
Диёр
У хаскеля на хвостовой рекурсии ни с памятью проблем, ни с переполнением стека
Диёр
Так что о чём разговор вообще
David
David
где там хвостовая рекурсия?
Olzhas
Не проблема тех, кто может
не думаю что проблемы говнокода лучше перекладывать на компилятор
Olzhas
да и циклы хоть и выглядят страшно, но простые
Aliester
простые для человека, который привык к ним
Aliester
рекурсия натуральнее если у тебя математическое мышление
David
что И?
Aliester
индукция, все дела
David
И?
в рекурсивном квиксорте нет хвостовой рекурсии
Алексей
да и циклы хоть и выглядят страшно, но простые
Не всегда. Не все рекурсивные алгоритмы преобразуются в красивые циклы
Aliester
плюс циклы не являются абстрагируемой единицей и строго процедурны
Aliester
короче говоря - не подлежат генерализации и не очень вписываются в современное ПО
Aliester
как там у вас, слышал дженерики завезли наконец-то
Алексей
Скорее за ФП, хотя он и так уже идёт
Olzhas
фп заебись
Алексей
как там у вас, слышал дженерики завезли наконец-то
Ой, нехорошее слово на д, ща забанят
Алексей
фп заебись
Но в тру фп нету циклов
David
циклы не нужны
Lucky
как жить то без них?
Marperia
как жить то без них?
Рекурсивные функции.
Aliester
любой цикл можно представить в виде рекурсии и наоборот
Co(n)stantine👨‍🔬
как жить то без них?
в жаве есть streams
Marperia
А причём тут ФП и golang? Там же кроме замыканий ничего нельзя.
Alexander
зачастую цикл вообще можно заменить специальными функциями для обработки структур данных. типа filter, map, reduce и тд
Pawel
Ну так я не понял, сортировка с рекурсией — это харам, или всё таки так пайк завещал и нам велел?
да по фигу как написана стандартная сортировка. Это вообще не в тему здесь
Мерль
Ну то есть: - рекурсия это плохо - очень плохо - она ест память - процессор - стек Если только она не написана авторами го. Тогда она прекрасна
Vladimir
Шок: рекурсия ест процессор
David
особенно плохо, когда она написана на хаскеле, на хаскеле она есть в nlogn раз больше памяти и процессоров
Мерль
да по фигу как написана стандартная сортировка. Это вообще не в тему здесь
Это именно в тему того, что рекурсию можно применять, если она удобна А она бывает удобна, и не только в стд Невероятно, но факт
Aliester
и специально работает медленнее
Marperia
Только это скорее lisp и haskell. Причёт тут go вообще? Или кто-то научился функционально на нём писать?
Vladimir
Сэр, вы ходите по охуенно тонкому льду. Бывают рекурсии без возрастания стека.
Рекурсия написанная авторами го имеет -10 к возрастанию стека
Pawel
Это именно в тему того, что рекурсию можно применять, если она удобна А она бывает удобна, и не только в стд Невероятно, но факт
бывает, но крайне редко. Её всегда можно переписать через циклы, это в 99% случаев это будет лучше читаться и эффективней работать
Алексей
Стек реализованный руками вообще никогда не будет лучше читаться
Pawel
Это именно в тему того, что рекурсию можно применять, если она удобна А она бывает удобна, и не только в стд Невероятно, но факт
ты так гоовришь как будто ты единственный тут читал SICP а я типа не читал, а просто так набрасываю
Aliester
99%
Cat
мне для школы