Skip to content

Instantly share code, notes, and snippets.

@rranelli
Created February 5, 2019 21:37
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rranelli/587a01a7d74191b1b5f646e88a511f07 to your computer and use it in GitHub Desktop.
Save rranelli/587a01a7d74191b1b5f646e88a511f07 to your computer and use it in GitHub Desktop.
defmodule Pentabonacci do
import Integer, only: [is_odd: 1]
defp calc(0, _), do: 0
defp calc(1, _), do: 1
defp calc(2, _), do: 1
defp calc(3, _), do: 2
defp calc(4, _), do: 4
defp calc(n, ets) do
case :ets.lookup(ets, n) do
[{_, cached_result}] ->
IO.puts("got cached #{cached_result}")
cached_result
_otherwise ->
IO.puts("calculating #{n}")
result = calc(n - 1, ets) + calc(n - 2, ets) + calc(n - 3, ets) + calc(n - 4, ets)
IO.puts("inserting #{n} -> #{result}")
:ets.insert(ets, {n, result})
result
end
end
def count_odd(n) do
ets = :ets.new(:qualquercoisa, [])
0..n
|> Enum.map(&calc(&1, ets))
|> Enum.count(&is_odd/1)
end
end
Pentabonacci.count_odd(1000)
@rranelli
Copy link
Author

rranelli commented Feb 5, 2019

versão sem ets e com :erlang.get e :erlang.pu

defmodule Pentabonacci do
  import Integer, only: [is_odd: 1]

  defp calc(0), do: 0
  defp calc(1), do: 1
  defp calc(2), do: 1
  defp calc(3), do: 2
  defp calc(4), do: 4

  defp calc(n) do
    case :erlang.get(n) do
      :undefined ->
        IO.puts("calculating #{n}")
        result = calc(n - 1) + calc(n - 2) + calc(n - 3) + calc(n - 4)

        IO.puts("inserting #{n} -> #{result}")
        :erlang.put(n, result)
        result

      cached_result ->
        IO.puts("got cached #{cached_result}")
        cached_result
    end
  end

  def count_odd(n) do
    0..n
    |> Enum.map(&calc(&1))
    |> Enum.count(&is_odd/1)
  end
end

Pentabonacci.count_odd(1000)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment