gpt4 book ai didi

functional-programming - 斐波那契与内存 Elixir

转载 作者:行者123 更新时间:2023-12-05 03:05:57 30 4
gpt4 key购买 nike

我正在研究函数式编程,我在 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com