我正在上课算法,我现在正在解决一些关于动态编程的练习。
我查看了如何在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实现。
提前致谢!
答案 0 :(得分:1)
据我所知,视图无法用于构建无限的东西,而迭代器可以是无限的,不会将任何值存储在自身内。
Haskell解决方案也不是无限的。
将此转换为Scala的好方法是什么?
我从定义
开始class Lazy[A](calculation: => A) {
lazy val value: A = calculation
}
=> A
是一个按名称参数,这意味着当您编写val x = Lazy { ... }
时,...
内的代码不会立即执行;相反,它将在访问value
时。
然后使用Array[Lazy[A]]
(Array[Lazy[(Int, Int, Int)]]
作为此特定功能。)