|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Привет друзья. Илья. Сов. Саша. Зяма. Дима. И все-все другие мемберы. Давайте поговорим про хорошие сценарии использования рекурсий в С++. Степанов в своей книге различает "хвостовую" и "строгую хвостовую рекурсию". У меня соотв. Вопросы. В каких случаях она не детектируется и код будет собран как чисто-рекурсивный? Спасибо всем. Ваш покорный слуга mayton ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 22:13 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Зависит от умности оптимизатора. Но чаще всего, только строгая разворачивается в цикл. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2017, 00:01 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
последний раз я это ковырял в третьем gcc лет пять назад, и классический пример не разворачивался. Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2017, 00:05 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
сорри, Степанова не читал, но всегда думал, что "оптимизация хвостовой рекурсии" может быть сделана уже на уровне машинного кода тупой заменой Код: sql 1. 2.
на Код: sql 1.
(если мы знаем, что xxx - адрес начала этой же функции) на уровне генерации машинного кода такая замена явно не сложнее ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2017, 11:42 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Я вообще не знаю за Степанова, за строгую хвостовую рекурсию, но оптимизироваться она может просто за счёт "схлопывания" фрейма стека: вместо того, чтобы при вызове функции делать новый фрейм с пермеменными, новый вызов может использовать старый фрейм со старыми переменными, переписав их новыми значениями, если нужно. Это ка бы не цикл, но эффективно как цикл. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2017, 15:03 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
MasterZivЭто ка бы не цикл, но эффективно как цикл. Это цикл. Там goto на начало )) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2017, 22:12 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
mayton, слишком специфично под каждый компилятор скорее всего только самые простые оптимизации под "строгую хвостовую рекурсию" если повезёт в языке без явных гарантий нельзя полагаться на это 100% https://habrahabr.ru/company/pvs-studio/blog/261027/ https://habrahabr.ru/company/pvs-studio/blog/261029/ ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2017, 22:59 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
mayton, klirichekЯ, может, сейчас жутко крамольную вещь скажу… Но не кажется ли, что в ДАННОМ случае вместо массажа опций компилятора и рассматривания дизассемблера можно просто написать goto в исходном коде и получить нужный результат независимо от положения звёзд?+1 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2017, 23:04 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Многие алгоритмы намного проще и понятнее выглядят именно в рекурсивной форме, потому что в итеративной форме надо явно хранить состояние, а в рекурсивной оно часто скрыто под капотом. Поэтому не всегда можно просто "просто написать goto "))) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2017, 12:09 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyМногие алгоритмы намного проще и понятнее выглядят именно в рекурсивной форме, потому что в итеративной форме надо явно хранить состояние, а в рекурсивной оно часто скрыто под капотом. Поэтому не всегда можно просто "просто написать goto "))) "строгую хвостовую рекурсию". ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2017, 22:26 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Окей. Поскольку топик заглох я подкину дровишек. В книге - А.Степанов Д.Роуз - От Математики к обобщенному программированию Во главе 2.1 Степанов рассуждает о методе Египетского умножения. Кратко поясню суть. Один из множетелей раскладывается на сумму двоичных коэффициентов 1,2,4...e.t.c. и раскрываются скобки. Далее - умножение сводится к сложению. Есть поинт в том что количество операций будет минимально. Рекурсия используется в качестве базового алгоритма. Далее в главе 2.2 Степанов пытается уйти от рекурсии и фактичкески заменить ее итерацией. Но для этого он делает несколько эквивалентных преобразований. Приводится также определение: Говорят что функция обладает свойством строгой хвостовой рекурсии если во всех хвостовых рекурсивных вызовах формальные параметры совпадают с соответствующими аргументами. С позволения Степанова я публикую фрагмент кода (не финальный). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Далее идет еще цепочка ручных трансформаций где Степанов сводит это к итерации. По сабжу меня интересовал только рекурсивный вариант. Поэтому я на этом остановлюсь. Зависимые функции четности и деления пополам - half(),odd() я поскипаю. Они тривиальны. Интересует также связь этого метода с оптимизацией умножения в длинных целых. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2017, 14:04 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
maytonОдин из множетелей раскладывается на сумму двоичных коэффициентов 1,2,4...e.t.c. и раскрываются скобки. если о цели: я может чего не понимаю, но какой смысл выполнять обычный алгоритм "умножение столбиком"? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2017, 21:57 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
kealon(Ruslan)если о цели: я может чего не понимаю, но какой смысл выполнять обычный алгоритм "умножение столбиком"?Когда пишется собственная реализация арифметики больших чисел - смысл появляется. Причины написания могут быть разные. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2017, 21:59 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, я в плане алгоритма, зачем использовать заведомо O(n^2), можно для начала взять хотя бы тот же алгоритм Карацубы ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2017, 22:09 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
kealon(Ruslan)зачем использовать заведомо O(n^2), можно для начала взять хотя бы тот же алгоритм КарацубыАлгоритм Карацубы настолько сложен, что оправдывает себя только на очень больших числах. Или я неправ? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2017, 22:23 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Basil A. Sidorovkealon(Ruslan)зачем использовать заведомо O(n^2), можно для начала взять хотя бы тот же алгоритм КарацубыАлгоритм Карацубы настолько сложен, что оправдывает себя только на очень больших числах. Или я неправ?все они имеют определённый лимит от которого становятся разумны Алгоритм Фюррера например хоть и O(N*Ln(n)), но проигрывает на мелких числах ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2017, 22:33 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
kealon(Ruslan)maytonОдин из множетелей раскладывается на сумму двоичных коэффициентов 1,2,4...e.t.c. и раскрываются скобки. если о цели: я может чего не понимаю, но какой смысл выполнять обычный алгоритм "умножение столбиком"? Я понимаю внутренне ваше возмущение. Скажу честно что я не сравнивал метод Карацубы и метод Египтян. Более того я даже не считаю что он (Египетский) хорош. Просто тема топика - рекурсия и я взял первый материал который под рукой оказался. А по теме египтян могу предположить что умножение в столбик было им недоступно скорее всего по причине того что их система записи чисел - непозиционная. Видимо сравнение и сложение для них было проще. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2017, 22:36 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
kealon(Ruslan)Basil A. Sidorovпропущено... Алгоритм Карацубы настолько сложен, что оправдывает себя только на очень больших числах. Или я неправ?все они имеют определённый лимит от которого становятся разумны Алгоритм Фюррера например хоть и O(N*Ln(n)), но проигрывает на мелких числах Окей. Давайте их тоже обсудим. Но на правах топик-стартера я прошу учесть хештеги #C++ и #рекурсия. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2017, 22:41 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
mayton, да нету никакого возмущения, просто фактически это умножение в столбик, с предварительным переводом одного из операндов в двоичную форму. собственно по теме: повлиять на алгоритм компилятора мы в принципе не особо можем, а вот выдать ему код без рекурсии - можем. ИМХО если идти напрямую от комбинатора неподвижной точки, то можно написать генератор кода для любой итеративной функции, которую возможно так разложить. Вот только зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2017, 22:57 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Нет. Как раз интересно дать ему код с рекурсией. Но на выходе получить safe-stack-overflow код. Ну... если не повезло - то хотя-бы увидеть Warning уровня компилляции. "Не шмогла..." дескыть. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2017, 00:28 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
kealon(Ruslan)... если о цели: я может чего не понимаю, но какой смысл выполнять обычный алгоритм "умножение столбиком"? ничего общего от слова совсем: столбик сформулирован в терминах позиционного представления числа а египетскому умножению (он же - russian peasant algorithm) до лампады представление числа. Он работает в терминах удвоения, деления пополам и определения четности. К тому, что понятно как удваивать - 100% шансы применить этот алгоритм. Попробуйте применить столбик к размножению строк. А египетское умножение отменно обеспечивает умножение целых чисел, возведения их в степень, возведение в степень квадратных матриц, кватернионов и строк, а как бонус еще и вычисление чисел Фибоначчи. Возведения в целую степень вообще всего, что может быть мыслимо как полугруппа с ассоциативной операцией. Книжка эта про обобщенное программирование, а египетское умножение - базовый алгоритм, на примере которого и раскрывается представление об обобщенном программировании. kealon(Ruslan)Basil A. Sidorov, я в плане алгоритма, зачем использовать заведомо O(n^2), можно для начала взять хотя бы тот же алгоритм Карацубы Зря вы это сказали. Алгоритмы анализируются в ценах элементарных (базовых для анализа) операций. Для этого алгоритма элементарной операцией является операция сложения. И выполняется она Log(n) раз. То есть, с точки зрения выполнения базовых операций, с ростом масштаба задачи, данный алгоритм масштабируется как суперконстанта по отношению к числу выполняемых базовых операций. Надо совсем не иметь представления об обсуждаемом предмете, чтобы задавать вопрос - зачем рассматривать такой алгоритм. maytonЗависимые функции четности и деления пополам - half(),odd() я поскипаю. Они тривиальны. Дело не в том, тривиальны они или нет, а в том, какое поведение они ожидают от применяемого к ним параметра. В данном случае - поведение (целого) числа. Именно это и определяет направление дальнейшего будущего обобщения. Поэтому таким алгоритмом имеет смысл возводить квадратные матрицы в целую степень или размножать строки целое число раз, при условии, что базовая операция умножения матрицы или склейки строк будет предоставлена той полугруппой, которую представляет соответствующий параметр функции. А вот умножать строки на строки, или матрицы на матрицы таким алгоритмом нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2017, 02:53 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2017, 03:06 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
mayton, не знаю, зачем ты это написал. Если ты опять про "элементарность реализации", то я опять о том, что существо дела в другом. Параметры, передаваемые в алгоритм неравноценны и обобщаются по разному. Для n здесь нет толкового обобщения, отличного от смысла целого числа. Т.е. параметры у алгоритма неравноценны: а - может быть представлено любым типом, обеспечивающим поведение полугруппы n - может быть только типом, эквивалентным целому числу. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2017, 03:21 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Четность. И целочисленное деление на два. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2017, 03:27 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Точно ОК? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2017, 03:33 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
точно. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2017, 03:43 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
boobyничего общего от слова совсем: столбик сформулирован в терминах позиционного представления числаи к чему он приводит любое число? вангую что к двоичному представлению boobykealon(Ruslan)Basil A. Sidorov, я в плане алгоритма, зачем использовать заведомо O(n^2), можно для начала взять хотя бы тот же алгоритм Карацубы Зря вы это сказали. Алгоритмы анализируются в ценах элементарных (базовых для анализа) операций. Для этого алгоритма элементарной операцией является операция сложения. И выполняется она Log(n) раз. То есть, с точки зрения выполнения базовых операций, с ростом масштаба задачи, данный алгоритм масштабируется как суперконстанта по отношению к числу выполняемых базовых операций. Надо совсем не иметь представления об обсуждаемом предмете, чтобы задавать вопрос - зачем рассматривать такой алгоритм.с тем, что сложение базовая операция для длинных чисел я не соглашусь, всё таки у неё цена O(N) отсюда и выходит O(N^2) для оценки "умножения столбиком". В контексте умножения двух чисел - это бесполезный алгоритм. maytonНет. Как раз интересно дать ему код с рекурсией. Но на выходе получить safe-stack-overflow код. Ну... если не повезло - то хотя-бы увидеть Warning уровня компилляции. "Не шмогла..." дескыть. Далеко полез, чё по проще заставить его посчитать - и то проблема. Компиляторы довольно ограниченная "вещь в себе". ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2017, 09:26 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Мне кажется что Буби как-то сходу внес в топик сам вопро определения алгебры для нашего алгоритма. Мне сложно говорить на эту тему т.к. надо сначала почитать соотв. теорию, а времени нет и возникают вопросы более насущные и актуальные. Забегая вперед... в последних главах книги Степанов касается обобщений чисел. Но я-бы предложил поскипать это и пока говорить о рекурсии. P.S. Вобщем ... просил я только масла на завтрак мне подать (с) Баллада о королевском бутерброде ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2017, 10:22 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
White Owlпоследний раз я это ковырял в третьем gcc лет пять назад, и классический пример не разворачивался. Код: plaintext 1. 2. 3. 4.
А что вы ожидали от этого примера? Не очень понятен смысл. Если имеется ввиду переход к циклу, то это не похоже на хвостовую рекурсию, потому такой разворот(если я правильно понял смысл этого слова) и не должен произойти Anatoly MoskovskyMasterZivЭто ка бы не цикл, но эффективно как цикл. Это цикл. Там goto на начало )) Вероятно речь шла не о полученном наборе инструкций после трансляции программы, а об исходном синтаксисе) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2017, 01:54 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Докину в тему. Вариант хвостовой рекурсии в Scala. Для сравнения. Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
В данном случае аннотация @tailrec дополнительно информирует компиллятор о требовании размотки рекурсии в цикл. Не всякая рекурсия разматывается. Должен присутсвовать аккумулятор. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 03:22 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
mayton, Scala - функциональный язык, не знаю как в нутрах компилятора сделано, но если так же как в хаскель, т.е. компилируется в комбинаторы, то вполне реальная вещь kealon(Ruslan)ИМХО если идти напрямую от комбинатора неподвижной точки, то можно написать генератор кода для любой итеративной функции, которую возможно так разложить. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 10:32 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Возвращаясь к теме С++. Зачем Степанову понадобилась строгая хвостовая? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 10:42 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
maytonВозвращаясь к теме С++. Зачем Степанову понадобилась строгая хвостовая?микроконтроллёры например, но то так, пальцем в небо медленнно работают рекурсивные вызовы + непредсказуемое поведение ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 10:45 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Из стековерфлоу. https://stackoverflow.com/questions/34125/which-if-any-c-compilers-do-tail-recursion-optimization#220660 Претендует на хвостовую. Но не строгая. Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Забавно если бы я хотел выровнять формальные параметры то сломал-бы простоту и лаконичность всего atoi. Было-бы что-то вроде. Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 01:05 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Еще один пример с хвостиком. От Массачусетских языков. Кодинг - мой. И возможные баги тоже мои. Первый исходник - лобовое решение факториала. Второй - с оптимизацией. В книге пишут что tail-recursion обязателен для сертификации всех реализаций Scheme. Код: python 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 02:37 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
mayton, давай функциональные языки не будем рассматривать, там всё фундаментально понятно и доказано когда можно и когда нельзя - 21059004 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 09:33 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Руслан. Большинство "инициативных" топиков здесь требуют немедленного ответа на вопрос "зачем". Скорее всего низачем. Просто - игры разума. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 10:57 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
mayton Давайте поговорим про хорошие сценарии использования рекурсий в С++. Степанов в своей книге различает "хвостовую" и "строгую хвостовую рекурсию". А чем по Степанову хвостовая рекурсия отличается от строгой хвостовой? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 11:27 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Ну вот тут-же цитата 21058333 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 11:31 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
mayton, я просто говорю, что для функциональных языков этот вопрос фундаментально закрыт - надо, отсюда и логичное требование в сертификации ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 11:55 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
Хорошо. Не будем трогать функциональные. Просто к слову пришлось. Будем издеваться над императивными. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 14:18 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
petrav mayton Давайте поговорим про хорошие сценарии использования рекурсий в С++. Степанов в своей книге различает "хвостовую" и "строгую хвостовую рекурсию". А чем по Степанову хвостовая рекурсия отличается от строгой хвостовой? Для строгой хвостовой рекурсии есть железобетонный, гарантированный алгоритм разворота в простой цикл. Поэтому, в таком случае, программист имеет право писать "красиво", а обученный компилятор сделает "как надо". Если алгоритм обладает строгой строгой хвостовой рекурсией, то использование удобной рекурсивной записи программистом бесплатно с точки зрения накладных расходов. "умный" компилятор рекурсию полностью исключит и заменит на цикл. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 15:44 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
booby petrav пропущено... А чем по Степанову хвостовая рекурсия отличается от строгой хвостовой? Для строгой хвостовой рекурсии есть железобетонный, гарантированный алгоритм разворота в простой цикл. Поэтому, в таком случае, программист имеет право писать "красиво", а обученный компилятор сделает "как надо". Если алгоритм обладает строгой строгой хвостовой рекурсией, то использование удобной рекурсивной записи программистом бесплатно с точки зрения накладных расходов. "умный" компилятор рекурсию полностью исключит и заменит на цикл. Спасибо. Вот вы понятно пояснили. Тока мне кажется, что сама идея этой хвостовой рекурсией не совместима с C++. Что будет с вызовом деструкторов локальных объектов? Правильно, они похерятся. Т.е. по хорошему нужно вводить атрибут какой-то для таких функций: типа настаиваю на такой фишке, а компилятор уже проверяет может или не может. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 15:58 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
petrav, тут дела так стоят: Использование рекурсии вообще какой-то - неотделимо от императивного программирования. Заявить несовместимость рекурсии с языком эквивалентно заявлению о неспособности реализовать в этом языке циклический алгоритм произвольного вида. Рекурсия вообще - это идея циклического алгоритма вообще. Специальные случаи вроде строгой хвостовой позволяют свести алгоритм к простому циклу. Например, свести самому программисту (и не ошибиться при этом), даже если компилятор этого делать не умеет. Делать это или нет - вопрос борьбы за время организации вызова и передачи параметров. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 16:25 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
booby, ну, для каких-то случаев - еще и за размер стека. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 16:29 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
petrav Тока мне кажется, что сама идея этой хвостовой рекурсией не совместима с C++. Что будет с вызовом деструкторов локальных объектов? Правильно, они похерятся. Т.е. по хорошему нужно вводить атрибут какой-то для таких функций: типа настаиваю на такой фишке, а компилятор уже проверяет может или не может. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 20:01 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
kealon(Ruslan) petrav Тока мне кажется, что сама идея этой хвостовой рекурсией не совместима с C++. Что будет с вызовом деструкторов локальных объектов? Правильно, они похерятся. Т.е. по хорошему нужно вводить атрибут какой-то для таких функций: типа настаиваю на такой фишке, а компилятор уже проверяет может или не может. Они (деструкторы) начнут вызываться в неправильной последовательности. Это принципиально. Или же они вообще перестанут вызываться. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 20:07 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
petrav kealon(Ruslan) пропущено... почему они похерятся? Они (деструкторы) начнут вызываться в неправильной последовательности. Это принципиально. Или же они вообще перестанут вызываться. А как деструкторы связаны с хвостовой рекурсией? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 20:27 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
mayton petrav пропущено... Они (деструкторы) начнут вызываться в неправильной последовательности. Это принципиально. Или же они вообще перестанут вызываться. А как деструкторы связаны с хвостовой рекурсией? Я понял тему топика так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Я корректно всё понял? И вместо рекурсии в ассемблере будет jump на начало функции? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 20:36 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
petrav Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Я корректно всё понял? И вместо рекурсии будет jump на начало функции? Я не силен в теории построения компилляторов. Но по моему свертка хвоста превращает рекурсию в банальный loop. Как там в ассемблере делется loop? Я щас не помню. Много вариантов. Да можно jump сделать. А можно JNZ (jump-non-zero-flag). Суть вобщем не в этом. А в том что стек не будем потреблять. И еще убийственная киллер фича всей функциональщины - все переменные в такой функции становятся values. Константами. Раз нет цикла. То ничего и не меняется. Вселенная с застывшим временем. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 20:41 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
mayton Я не силен в теории построения компилляторов. Но по моему свертка хвоста превращает рекурсию в банальный loop. Как там в ассемблере делется loop? Я щас не помню. Много вариантов. Да можно jump сделать. А можно JNZ (jump-non-zero-flag). Суть вобщем не в этом. А в том что стек не будем потреблять. И еще убийственная киллер фича всей функциональщины - все переменные в такой функции становятся values. Константами. Раз нет цикла. То ничего и не меняется. Вселенная с застывшим временем. Отлично. Я как раз недавно смотрел научно популярный ролик как вернуть время назад. На Физике Побединского. Но вернёмся к деструкторам и доработаем код. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Тут два варианта: - При честной рекурсии у нас деструкторы класса MyObject вызываются в правильной последовательности. - А при фокусах с разворачиванием рекурсии в цикл что с ними будет? ПНХ? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 20:49 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
petrav, в вашем примере для компилятора нет хвостовой рекурсии так как вызов не хвостовой, он такой лишь на первый взгляд ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 20:58 |
|
Тяпничная хвостовая рекурсия.
|
|||
---|---|---|---|
#18+
kealon(Ruslan) petrav, в вашем примере для компилятора нет хвостовой рекурсии так как вызов не хвостовой, он такой лишь на первый взгляд Конечно, я понимаю, что деструктор неявно вызывается в конце функции. Упрощённо. Но что будет если MyObject изначально был алиасом к int, а потом я переделал MyObject на класс с деструктором? Поэтому я сразу и написал, что тогда в язык нужно добавить атрибут к функции "настаиваю на хвостовой рекурсии". Не получилось -- сбой компиляции. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 21:03 |
|
|
start [/forum/topic.php?all=1&fid=57&tid=2017275]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 167ms |
0 / 0 |