再帰はクールですが、高階ライブラリ関数に囲まれている場合は低レベルです。最後に生成された値に依存するプロセスの再帰関数を記述しないようにしています。
私は通常iterate
、最後の値と現在のパラメーターの「zip形式」リストに対してClojureの関数を使用します。ScalaのコレクションAPIに同等の関数はありますか?
これは、いくつかのクレイジーな擬似コードの抽象的な例の試みです。
あなたが持っていると言う
- 入力リスト:
Seq(1,2,3)
生成された最後の値とリスト内の次の項目に対して実行するアクション:
lastValue ^ 2 + nextInt(i)
生成されたすべての値を累積する必要があります。
私は次のようなものを書かないようにしています:
def f(ls:Seq[Int]):Seq[Float] = {
def g(pos:Int, lastGen:Float):Seq[Float] = {
val v = gen(lastGen, ls(pos))
if( end(v) )
Seq(v)
else
Seq(v) ++ g(pos+1, v)
}
f(0, 1)
}
Haskellでフィボナッチのレイジーストリームバージョンを定義するのに似たようなものを見たので、仮想的にはそれ自体を参照するレイジーストリームを使用できますが、Clojureの反復よりも脳を包み込むのは困難です。