【发布时间】:2017-02-08 01:44:07
【问题描述】:
我正在上一门算法课,我现在正在解决一些关于动态规划的练习。
我查看了如何在 Scala 中以函数式方式解决一些问题,从我从标准库的 scaladoc 中阅读的内容中,我发现流、视图和迭代器可能是合理的。
但是我会使用大量随机访问,因此 Streams 的效率会非常低,因为单链表需要 O(n) 时间进行索引访问。据我所知,视图不能用于构建无限的东西,并且可以无限的迭代器不会在其内部存储任何值。
然后,我从haskell wiki 找到了这个,这正是我需要的,除了它在 Haskell 中:
import Data.Array
import Control.Monad(guard,mplus)
buy n = r!n
where r = listArray (0,n) (Just (0,0,0) : map f [1..n])
f i = do (x,y,z) <- attempt (i-6)
return (x+1,y,z)
`mplus`
do (x,y,z) <- attempt (i-9)
return (x,y+1,z)
`mplus`
do (x,y,z) <- attempt (i-20)
return (x,y,z+1)
attempt x = guard (x>=0) >> r!x
将其转换为 Scala 的好方法是什么?我有一种感觉,我需要导入一个外部库(如 scalaz)(但我将无法提交作业)或基于 Scala Array 或 Vector 编写一个新的 Stream 实现。
提前致谢!
【问题讨论】:
标签: scala functional-programming stream dynamic-programming