pascalの三角形

昔は、こんな風に作ってた。
でも、この方があとで見たとき分かりやすいような気がする。
(明示的な再帰を避けるとあとで読みやすいのかもしれない)

(define (shift-left seq)
  (cons 0 seq))

(define (shift-right seq)
  (reverse (shift-left seq)))

(define (adjoin seq)
  (map + (shift-left seq) (shift-right seq)))

(define (pascal n)
  (reverse
   (fold (lambda (x rest)
           (cons (adjoin (car rest)) rest)) '((1)) (iota n))))

(for-each print (pascal 10))
;;gosh> (1)
;; (1 1)
;; (1 2 1)
;; (1 3 3 1)
;; (1 4 6 4 1)
;; (1 5 10 10 5 1)
;; (1 6 15 20 15 6 1)
;; (1 7 21 35 35 21 7 1)
;; (1 8 28 56 70 56 28 8 1)
;; (1 9 36 84 126 126 84 36 9 1)
;; (1 10 45 120 210 252 210 120 45 10 1)