我试图在 Clojure 中编写一个简洁、懒惰的帕斯卡三角形,旋转使得行/列跟随三角形的对角线。也就是说,我想生成以下惰性序列的惰性序列:
((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 进行编程非常陌生,并且对其中涉及的问题的思考方式非常不同,因此我非常感谢任何对此更有经验的人的建议。