Size: a a a

2020 August 27

Е

Евгений in pro.elixir
Полюбас при обычной рекурсии, нужно использовать стек или его заменитель, то бишь запоминать предыдущие аргументы и адрес возврата.
TCO недаром называется оптимизацией, а в BEAM это получается пессимизация :)
источник

Е

Евгений in pro.elixir
TCP :)
источник

LL

Lama Lover in pro.elixir
Źmićer Rubinštejn
Вроде чувствуешь... Так зачем тогда набрасываешь? 🙃
Так вот в каком-нибудь языке без хвостовой рекурсии можно очень грубо сказать что call stack == computation stack (например в python)
А вот в BEAM так не получится, потому что стек вызовов может быть огромным из-за рекурсии, а вот стек вычислений может оставать константым из-за tco
источник

LL

Lama Lover in pro.elixir
Евгений
Полюбас при обычной рекурсии, нужно использовать стек или его заменитель, то бишь запоминать предыдущие аргументы и адрес возврата.
TCO недаром называется оптимизацией, а в BEAM это получается пессимизация :)
Почему?
источник

Е

Евгений in pro.elixir
Lama Lover
Почему?
Что именно "Почему"?
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Есть оптимизация вызова, а есть оптимизация рекурсии. Это разные вещи и мы тут вроде уже это обсуждали
источник

LL

Lama Lover in pro.elixir
Евгений
Что именно "Почему"?
Почему TCO не оптимизация?
источник

Е

Евгений in pro.elixir
Źmićer Rubinštejn
Есть оптимизация вызова, а есть оптимизация рекурсии. Это разные вещи и мы тут вроде уже это обсуждали
Я говорю именно про оптимизацию вызова.
источник

Е

Евгений in pro.elixir
получается, что алгоритм с хвостовой рекурсией и аккумулятором, медленее чем с обычной рекурсией и без аккумулятора, но по факту аккумулятор и в обычной рекурсии есть.
источник

LL

Lama Lover in pro.elixir
Евгений
получается, что алгоритм с хвостовой рекурсией и аккумулятором, медленее чем с обычной рекурсией и без аккумулятора, но по факту аккумулятор и в обычной рекурсии есть.
Так получается только в одном конкретном случае. И не из-за проблемы с хвостовой рекурсией, а из-за оптимизации для функций f, возвращающих [some_value | f(args)]
источник

AB

Alex Bubnov in pro.elixir
может вы уже начнете бенчмарки писать?
источник

Е

Евгений in pro.elixir
Lama Lover
Почему TCO не оптимизация?
Я не знаю. То ли как-то хвостовая рекурсия неоптимально реализована в BEAM, то ли он обычную рекурсию умеет круто оптимизировать в цикл, я не знаю.
источник

AB

Alex Bubnov in pro.elixir
Евгений
Я не знаю. То ли как-то хвостовая рекурсия неоптимально реализована в BEAM, то ли он обычную рекурсию умеет круто оптимизировать в цикл, я не знаю.
два тезиса, оба ошибочные
источник

AB

Alexey Bolshakov in pro.elixir
источник

Е

Евгений in pro.elixir
В любом случае это вещи неочевидные скажем так.
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Разница в том, что в body recursion ты собираешь «аккумулятор» задом наперёд. И не надо делать reverse
источник

Е

Евгений in pro.elixir
Лично я, если уверен, что глубина вызовов гарантированно не будет слишком большой, делаю обычную рекурсию, а не хвостовую с аккумулятором.
источник

AB

Alex Bubnov in pro.elixir
Евгений
Я не знаю. То ли как-то хвостовая рекурсия неоптимально реализована в BEAM, то ли он обычную рекурсию умеет круто оптимизировать в цикл, я не знаю.
tco либо есть, либо её нет, нет никакой оптимальности
нет никакой "оптимизации обычной рекурсии", только tco
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Alex Bubnov
tco либо есть, либо её нет, нет никакой оптимальности
нет никакой "оптимизации обычной рекурсии", только tco
Есть «оптимизация хвостовой рекурсии», когда она превращается в цикл
источник

ŹR

Źmićer Rubinštejn in pro.elixir
А tco это про jmp вместо call
источник