Size: a a a

2020 August 27

Е

Евгений in pro.elixir
Źmićer Rubinštejn
Вернее, скажем так: в Фибоначчи нету acc
есть, конечно, просто он не аккумулирует данные,
источник

Е

Евгений in pro.elixir
ща накидаю
источник

AB

Alex Bubnov in pro.elixir
Alex Bubnov
я в этой сомнительной дискуссии могу только отметить, что вчера написал один там depth-first traversal без аккумулятора, и сегодня считаю это очень большой глупостью.
а еще в нем, собственно, присутствует Enum.into в лист, что вообще говоря не дорого, но вызывает некоторок отвращение
источник

LL

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

LL

Lama Lover in pro.elixir
Фибоначчи пишется хвостовой рекурсией, всё нормально
источник

Е

Евгений in pro.elixir
Проверил. Фибоначчи хвостовая куда шустрее обычной:
defmodule Fib do
 def calc(1), do: 1
 def calc(2), do: 1
 def calc(n), do: calc(n - 2) + calc(n - 1)
end

defmodule FibTail do
 def calc(1), do: 1
 def calc(2), do: 1
 def calc(n), do: calc(n - 2, 1, 1)
 def calc(0, _, n2), do: n2
 def calc(n, n1, n2), do: calc(n - 1, n2, n1 + n2)
end


#IO.puts Fib.calc(100)
IO.puts FibTail.calc(100)
источник

LL

Lama Lover in pro.elixir
Евгений
Проверил. Фибоначчи хвостовая куда шустрее обычной:
defmodule Fib do
 def calc(1), do: 1
 def calc(2), do: 1
 def calc(n), do: calc(n - 2) + calc(n - 1)
end

defmodule FibTail do
 def calc(1), do: 1
 def calc(2), do: 1
 def calc(n), do: calc(n - 2, 1, 1)
 def calc(0, _, n2), do: n2
 def calc(n, n1, n2), do: calc(n - 1, n2, n1 + n2)
end


#IO.puts Fib.calc(100)
IO.puts FibTail.calc(100)
Конечно быстрее, потому что в обычной банально количество вызовов больше
источник

Е

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

Е

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

Е

Евгений in pro.elixir
или не в два раза :)
источник

Е

Евгений in pro.elixir
и отличается ли?
источник

LL

Lama Lover in pro.elixir
Евгений
в два раза, а время рассчета во много раз больше отличается
Нет, не в два раза
В хвостовой fib(n)n вызовов
В обычной fib(n)2^n вызовов
источник

Е

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

ŹR

Źmićer Rubinštejn in pro.elixir
Алгоритм просто соптимизированный
источник

LL

Lama Lover in pro.elixir
Źmićer Rubinštejn
Алгоритм просто соптимизированный
Что ты имеешь в виду?
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Ну что так скорости не меряют
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Один алгоритм тупо быстрее
источник

Е

Евгений in pro.elixir
Lama Lover
Нет, не в два раза
В хвостовой fib(n)n вызовов
В обычной fib(n)2^n вызовов
А почему 2^n?
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Он математически соптимизирован, а не компилятором
источник

LL

Lama Lover in pro.elixir
Źmićer Rubinštejn
Один алгоритм тупо быстрее
Вот именно, тут разницу body vs tail не померять
источник