【发布时间】:2018-10-11 14:12:06
【问题描述】:
我正在学习函数式编程,我在 elixir 中做了一个简单的斐波那契。
我知道在函数式编程中不可能改变值,我编写了一个代码来制作带有记忆的斐波那契,但代码很糟糕。 如何改进此代码?
defmodule Fib do
def fib_memoized(0, memo) do
{0, memo}
end
def fib_memoized(1, memo) do
{1, memo}
end
def fib_memoized(n, memo \\ %{}) do
if Map.has_key?(memo, n) do
{ memo[n], memo }
else
{n1, memo1} = fib_memoized(n-1, memo)
{n2, memo2} = fib_memoized(n-2, memo1)
value = n1+n2
{value, Map.merge(memo2, %{n => value})}
end
end
def fib(n) do
{ value, _ } = fib_memoized(n)
value
end
end
IO.puts Fib.fib(1000)
在javascript中可以创建一个高阶函数并保存“地图”并更新这个。
例如:
function memoization(fn) {
let memo = {}
return function (n) {
if(!memo[n]) {
memo[n] = fn(n)
}
return memo[n]
}
}
有可能做出类似的东西吗?
【问题讨论】:
-
Memoization and Dynamic Programming 在Real World Ocaml一书中谈到了记忆递归函数。该知识可以翻译成任何需要通用
memoization函数的语言。它甚至在其中一个示例中使用了斐波那契程序。希望这会有所帮助:D
标签: functional-programming elixir fibonacci memoization