作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究函数式编程,我在 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 中可以制作高阶函数并保存“ map ”并更新此 map 。
例如:
function memoization(fn) {
let memo = {}
return function (n) {
if(!memo[n]) {
memo[n] = fn(n)
}
return memo[n]
}
}
有可能做出类似的东西吗?
最佳答案
通常当我必须在 elixir 中存储状态时,我会启动一个进程来这样做。在斐波那契案例中 Agent
非常适合。
可以这样写:
defmodule Fib do
use Agent
def start do
Agent.start_link(fn -> %{0 => 0, 1 => 1} end, name: __MODULE__)
end
def fib(n) do
cached_value = Agent.get(__MODULE__, &(Map.get(&1, n)))
if cached_value do
cached_value
else
v = fib(n - 1) + fib(n - 2)
Agent.update(__MODULE__, &(Map.put(&1, n, v)))
v
end
end
end
{:ok, _} = Fib.start
IO.puts Fib.fib(1000)
关于functional-programming - 斐波那契与内存 Elixir ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50118180/
我是一名优秀的程序员,十分优秀!