我正在编写一个函数来查找三角形数字,并且以递归方式编写它的自然方式:
function triangle (x)
if x == 0 then return 0 end
return x+triangle(x-1)
end
Run Code Online (Sandbox Code Playgroud)
但是尝试计算前100,000个三角形数字会在一段时间后出现堆栈溢出而失败.这是一个理想的memoize函数,但我想要一个能够记忆我传递给它的任何函数的解决方案.
我在Haskell中有以下功能:
memdb = -- load the contents of a database into memory as a Map
Run Code Online (Sandbox Code Playgroud)
然后我有以下几行:
map (\x -> memdb ! x) values
Run Code Online (Sandbox Code Playgroud)
我想memdb只生成一次Map,而不是每次迭代生成Map map.我可以用这样的东西做到这一点:
make_memdb = -- equivalent to memdb in previous example
memdb <- make_memdb
map (\x -> memdb ! x) values
Run Code Online (Sandbox Code Playgroud)
但这意味着我必须传递memdb给使用它的每个函数.有什么办法可以:
一个.避免memdb每次调用OR时重新计算
湾 将生成的值保存make_memdb为常量,以便我可以避免将其传递给使用它的每个函数?