2

私はアルゴリズムのクラスを取っていますが、今私は動的プログラミングに関するいくつかの演習を解決しています。配列/ベクトルのパフォーマンス特性を持つスカラストリーム

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実装を記述することはできません。

ありがとうございます!

答えて

1

私の知る限り、無限のものを構築するのに使用することはできません。無限にできるイテレータは、内部に値を格納しません。

ハスケル解も無限ではありません。

これをScalaに変換するにはどうすればよいでしょうか?私は

class Lazy[A](calculation: => A) { 
    lazy val value: A = calculation 
} 

=> Aあなたはval x = Lazy { ... }を書くとき、...内部のコードが即座に実行されていないことを意味名前によるパラメータである定義で始めたい

。代わりにvalueにアクセスすると表示されます。

Array[Lazy[A]](この特定の機能にはArray[Lazy[(Int, Int, Int)]])を使用してください。

関連する問題