第9夜:はてしない物語
数の悪魔*1を題材にSchemeの勉強をしています。今回は数列です。
こんな具合に、どんどん大きくなっていく。思ったよりも速く。ところで、ほかはどうだ。見おぼえがあるかね? - 数の悪魔
(define (sequence s proc) (define (sequence-iter c n m l) (if (> c s) (reverse l) ((lambda (x) (sequence-iter (+ c 1) x n (cons x l))) (proc c n m)))) (sequence-iter 1 0 0 '()) ) (define (main args) (print (sequence 15 (lambda (n x y) (if (<= n 1) 1 (+ x 1))))) (print (sequence 15 (lambda (n x y) (if (<= n 1) 1 (+ x 2))))) (print (sequence 15 (lambda (n x y) (if (<= n 2) 1 (+ x y))))) (print (sequence 15 (lambda (n x y) (if (<= n 1) 1 (+ x n))))) (print (sequence 14 (lambda (n x y) (if (<= n 1) 2 (* x 2))))) (print (sequence 11 (lambda (n x y) (if (<= n 1) 1 (* x n))))) 0)
結果は以下のとおり。
(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) (1 3 5 7 9 11 13 15 17 19 21 23 25 27 29) (1 1 2 3 5 8 13 21 34 55 89 144 233 377 610) (1 3 6 10 15 21 28 36 45 55 66 78 91 105 120) (2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384) (1 2 6 24 120 720 5040 40320 362880 3628800 39916800)
Gaucheには遅延ストリーム(遅延リスト)があります。数列にぴったりなのですが、私には、これが精一杯でした。
最後にウルフラム・アルファさんに聞いてみよう:http://www.wolframalpha.com/input/?i=sequence