第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

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