Я пытаюсь написать краткий, ленивый треугольник Паскаля в 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 и совсем другом способе мышления о проблеме, с которой он связан, поэтому я был бы очень признателен за предложения от любого, кто более опытен в этом.