25 lines
662 B
Elixir
25 lines
662 B
Elixir
defmodule Hofstadter do
|
|
defp flip(v2, v1) when v1 > v2, do: 1
|
|
defp flip(_v2, _v1), do: 0
|
|
|
|
defp list_terms(max, n, acc), do: Enum.map_join(n..max, ", ", &acc[&1])
|
|
|
|
defp hofstadter(n, n, acc, flips) do
|
|
IO.puts "The first ten terms are: #{list_terms(10, 1, acc)}"
|
|
IO.puts "The 1000'th term is #{acc[1000]}"
|
|
IO.puts "Number of flips: #{flips}"
|
|
end
|
|
defp hofstadter(max, n, acc, flips) do
|
|
qn1 = acc[n-1]
|
|
qn = acc[n - qn1] + acc[n - acc[n-2]]
|
|
hofstadter(max, n+1, Map.put(acc, n, qn), flips + flip(qn, qn1))
|
|
end
|
|
|
|
def main(max \\ 100_000) do
|
|
acc = %{1 => 1, 2 => 1}
|
|
hofstadter(max+1, 3, acc, 0)
|
|
end
|
|
end
|
|
|
|
Hofstadter.main
|