私はアルゴリズムのクラスを取っていますが、今私は動的プログラミングに関するいくつかの演習を解決しています。配列/ベクトルのパフォーマンス特性を持つスカラストリーム
Scalaの機能的な方法でいくつかの問題を解決する方法を探し、標準ライブラリのscaladocから読み込んだものから、ストリーム、ビュー、イテレータが妥当と思われるものであることがわかりました。
しかし、私は多くのランダムアクセスを使用しているため、単一リンクリストはインデックス付きアクセスにO(n)時間かかるため、Streamsは非常に非効率的です。ビューは、私が知る限り、無限のものを構築するために使用することはできません。無限になるイテレータは、内部に値を格納しません。
そして、私は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
スカラ座にこれを変換するための良い方法だろうか?私は外部ライブラリ(scalazのような)をインポートする必要があると感じていますが(私は割り当てを入れられません)、ScalaのArrayやVectorに基づいた新しいStream実装を記述することはできません。
ありがとうございます!