小编Dam*_*tin的帖子

关于记忆/评估的 Haskell 问题

我正在尝试在 Haskell 中编写“如何使用最少的硬币amount来访问各种面额的硬币”功能。coins我用 DFS 实现了这个,它可以工作,但速度太慢了。在Python(我的主要语言)中,我可以记住结果并让相同的算法运行得非常快。我尝试在 Haskell 中做同样的事情,但收效甚微。

我将给出一个问题的玩具版本,我试图理解记忆化,然后向 DFS 展示我实际上试图记忆化的情况。

玩具问题

Haskell Wiki 的 memoization 页面来看,实现此目的的一种方法是索引到无限列表中。类似的要点

memoized_fib :: Int -> Integer
memoized_fib = (map fib [0 ..] !!)
   where fib 0 = 0
         fib 1 = 1
         fib n = memoized_fib (n-2) + memoized_fib (n-1)
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义——常规递归关系调用记忆列表的索引,如果有的话,它会给出值,并且可以回退到辅助函数。:竖起大拇指:

一个小的修改就打破了这个:

memoized_fib :: Int -> Integer
memoized_fib n = (map fib [0 ..] !! n)  -- now no longer lazily evaled!
   where fib 0 = 0 …
Run Code Online (Sandbox Code Playgroud)

haskell memoization dynamic-programming

1
推荐指数
1
解决办法
78
查看次数

标签 统计

dynamic-programming ×1

haskell ×1

memoization ×1