第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