我正在尝试在Clojure中编写一个简洁,懒惰的Pascal三角形,旋转使得行/列跟随三角形的对角线.也就是说,我想生成以下lazy-seq的lazy-seq:
((1 1 1 1 ...)
(1 2 3 4 ...)
(1 3 6 10 ...)
...
)
Run Code Online (Sandbox Code Playgroud)
我写的代码是:
(def pascal
(cons (repeat 1)
(lazy-seq
(map #(map + %1 %2)
(map #(cons 0 %) (rest pascal)))
pascal
)))
Run Code Online (Sandbox Code Playgroud)
这样每一行都是通过将自身的右移版本添加到前一行来形成的.问题是它永远不会越过第一行,因为那时(map #(cons 0 %) (rest pascal)))
是空的.
=> (take 5 (map #(take 5 %) pascal))
((1 1 1 1 1))
Run Code Online (Sandbox Code Playgroud)
什么是解决这个问题的合理方法?我对Clojure中的编程很新,并且考虑到它涉及的问题的方式非常不同,所以我非常感谢任何有这方面经验的人的建议.