行/列が三角形の対角線に沿うように回転させた、簡潔で怠惰なパスカルの三角形を Clojure で書こうとしています。つまり、次のような lazy-seq の lazy-seq を生成したいと考えています。
((1 1 1 1 ...)
(1 2 3 4 ...)
(1 3 6 10 ...)
...
)
私が書いたコードは次のとおりです。
(def pascal
(cons (repeat 1)
(lazy-seq
(map #(map + %1 %2)
(map #(cons 0 %) (rest pascal)))
pascal
)))
各行は、それ自体の右シフトされたバージョンを前の行に追加することによって形成されます。問題は、最初の行(map #(cons 0 %) (rest pascal)))
が空であるため、最初の行を通過しないことです。
=> (take 5 (map #(take 5 %) pascal))
((1 1 1 1 1))
これを解決する賢明な方法は何ですか?私は Clojure でのプログラミングにかなりの初心者であり、それに関連する問題について非常に異なる考え方をしているので、経験豊富な人からの提案を本当に感謝しています。