第7夜:パスカルの三角形

数の悪魔*1を題材に、schemeの勉強その7回目、パスカルの三角形です。

普通の三角形じゃない。モニターなんだ。画面になる。サイコロたちの心には電気が通ってるが、それはなんのためか。スイッチを入れてやれば、明るくなるんだ - 数の悪魔

(define (pascals-triangle n)
	(define (tri-stair l nl)
		(if (null? (cdr l))
			nl
			(tri-stair (cdr l)
				(cons (+ (car l) (car (cdr l))) nl))))

	(define (tri-iter n l)
		(if (<= n 0)
			l
			(tri-iter (- n 1)
				(cons (tri-stair (cons 0 (car l)) '(0)) l))))

	(tri-iter n '((1 0)))
)

(define (display-triangle l proc)
	(define (lighting x) (if (proc x) (format #f " ~4D" x) " ----"))

	(define (display-stair n l)
		(define (stair-iter l nl)
			(if (null? (cdr l))
				nl
				(stair-iter (cdr l) (cons (lighting (car l)) nl))))
		(string-join (cons (make-string n #\space) (stair-iter l '())) ""))

	(define (display-iter s l nl)
		(if (null? l)
			(string-join nl "\n")
			(display-iter (+ s 2) (cdr l)
				(cons (display-stair s (car l)) nl))))

	(display-iter 0 l '())
)

(define (main args)
	(let ((tri (pascals-triangle 15)))
#;		(print (display-triangle tri (lambda (x) #t)))
		(print (display-triangle tri (lambda (x) (zero? (remainder x 4)))))
#;		(print (display-triangle tri (lambda (x) (even? x))))
	)
0)

lambda式を与えて、真になる部分に数字が入ります。結果はこちら。

                               ----
                             ---- ----
                           ---- ---- ----
                         ---- ---- ---- ----
                       ----    4 ----    4 ----
                     ---- ---- ---- ---- ---- ----
                   ---- ---- ----   20 ---- ---- ----
                 ---- ---- ---- ---- ---- ---- ---- ----
               ----    8   28   56 ----   56   28    8 ----
             ---- ----   36   84 ---- ----   84   36 ---- ----
           ---- ---- ----  120 ----  252 ----  120 ---- ---- ----
         ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
       ----   12 ----  220 ----  792  924  792 ----  220 ----   12 ----
     ---- ---- ---- ---- ---- ---- 1716 1716 ---- ---- ---- ---- ---- ----
   ---- ---- ----  364 ---- ---- ---- 3432 ---- ---- ----  364 ---- ---- ----
 ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

パスカルの三角形は組合せでも求められます。上から三段目の斜めを読むと三角数の数列が現れます。
最後に、ウルフラム・アルファさんに聞いてみよう:http://www.wolframalpha.com/input/?i=pascal%27s+triangle

*1:Hans Magnus Enzensberger,1997,Der Zahlenteufel,エンツェンスベルガー 丘沢静也(訳),2000,数の悪魔,晶文社