フィボナッチ数の遅延拡張無限シーケンスを返す関数を作成したいと思います。
今のところ、次のようにシーケンスをトップレベルの名前空間で使用できるようにすることができます。
(def fibonacci-numbers
(lazy-cat [0 1] (map + fibonacci-numbers (rest fibonacci-numbers))))
ただし、これは、それらを大量に消費し始めると、ガベージコレクションを制御できなくなることを意味します。
私は次のようなことをしたいと思っています:
(defn fibonacci-numbers-fn []
(lazy-cat [0 1] (map + (fibonacci-numbers-fn) (rest (fibonacci-numbers-fn)))))
O(2 ^ n)シーケンスを作成することになるため、これは明らかに機能しません。関数ローカル名前空間で自己参照のレイジーシーケンスを作成する方法を尋ねていると思います。私は何をすべきか?
編集:私はamalloyによって投稿され、インターネット全体で見つかった人気のあるソリューションがdefn fibs [] (map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))
好きですが、正規のHaskellの方法に似たバージョンに興味があります:
fibonaccis = 0 : 1 : zipWith (+) fibonaccis (tail fibonaccis)
これが私が本来の機能で達成しようとしていたことです。私にとって、map-iterateソリューションは「前の2つの要素を追加して新しい要素を作成する」のようになり、lazy-catソリューションは「最初のラグでストリームに参加する」のようになります。トップレベルの名前空間にシーケンスがない場合、どうすれば「最初のラグでストリームに参加」できますか?