(tosa-1-2 1) は 1 です
(tosa-1-2 2) は 3 です
(tosa-1-2 3) は 5 です
(tosa-1-2 1) は 1
(tosa-1-2 2) は 3
(tosa-1-2 3) は 5
(define tosa-1-2 (lambda (n)
(cond ((= n 1) 1)
((= n 2) 3)
((= n 3) 5)
(else "too big")))
このプログラムは確かに
(tosa-1-2 1) は 1
(tosa-1-2 2) は 3
(tosa-1-2 3) は 5
ですが、3より大きいと 数を返してくれません
第2項は 1 に 2を足したものです (第2項 と 第1項 の差が 2というのがが等差数列のお約束) 第3項は 第2項 に 2を足したものです 第4項は 第3項 に 2を足したものです なので 第n項は 第(n-1)項 に 2を足したものです
第1項は 1、それ以外の 第n項は 第(n-1)項 に 2を足したものをそのままプログラムしたものが
(define tosa-1-2 (lambda (n)
(cond ((= n 1) 1)
(else (+ (tosa-1-2 (- n 1)) 2)))))
(define tosa-1-2 (lambda (n)
(cond ((= n 1) 1)
(else (+ (tosa-1-2 (- n 1)) 2)))))
tosa-1-2の定義している最中に
tosa-1-2を呼び出しています
このテクニックを再帰(recursion)と呼びます。
(define tosa-1-2 (lambda (n)
(+ (tosa-1-2 (- n 1)) 2)))
(tosa-1-2 3) は
(tosa-1-2 2) (tosa-1-2 1) (tosa-1-2 0) (tosa-1-2 -1) (tosa-1-2 -2)とどこまでも、呼び出していって止まりません。 なので 定義の最初で止まる条件をチェックする ことが重要です
(define tohi-1-2 (lambda (n)
(cond ((= n 1) 1)
(else (* (tohi-1-2 (- n 1)) 2)))))
等差数列、等比数列に限らず ある数 n に対して hogeが決まることを 関数で hoge(n) と書けるとき hoge(1)が確定して ある hoge(n) から hoge(n+1) が作れるならば、 これは 番号ずらせば ある hoge(n-1) から hoge(n) が作れるならばとおなじですね
(define hoge (lambda (n)
(cond ((= n 1) 1のときの値)
(else hoge(n-1) から hoge(n)をつくる式 )))
です hoge が初項 a , 公差b の等差数列なら
hoge(1) = a
hoge(n) = hoge(n-1) + b
ですから
(define hoge (lambda (n)
(cond ((= n 1) a)
(else (+ (hoge (- n 1)) b)))))
となります
$a_{1},a_{2},a_{3},a_{4},\cdots,a_{n-1},a_{n},a_{n+1},\cdots$
のような数列を $ \{a_{n}\}$ と表す初項1,等差3 の 等差数列
初項1,公比2 の 等比数列
$ a_1 = 1,\; a_{n+1} = a_{n} + 3 $
以下のプログラムとほとんど同じ
(define a (lambda (n)
(cond ((= n 1) 1)
(else (+ (a (- n 1)) 3))
)
))
(define a (lambda (n)
(cond ((= n 1) 1)
(else (+ (a (- n 1)) (* 2 n) -3))
)
))
$a_{1} , a_{2} , a_{3} , a_{4},\cdots,a_{k-2},a_{k-1},a_{k}$
$\overbrace{ a_{1} + a_{2} + a_{3} + a_{4}+\cdots+a_{k-2}+a_{k-1}+a_{k} }^{数列 \{a_n\} の k 項までの和}$ 数列 ${a_n} $ の $k$ 項までの和 を $ S_{k} $とすると $ S_{k} = a_{1} + a_{2} + a_{3} + a_{4}+\cdots+a_{k-2}+a_{k-1}+a_{k} $$ S_{k} = \overbrace{a_{1} + a_{2} + a_{3} + a_{4}+\cdots+a_{k-2}+a_{k-1}}^{k-1 項までの和} + a_{k} $
$ S_{k} = \overbrace{a_{1} + a_{2} + a_{3} + a_{4}+\cdots+a_{k-2}+a_{k-1}}^{S_{k-1}} + a_{k} $
なので $ S_{k} = S_{k-1} + a_{k} $ $ k = 1 の時は 初項だけだから S_1 は a_1 だ $
(sum k)
とすると
(define sum (lambda (k)
(cond ((= k 1) (a 1))
(else (+ (sum (- k 1)) (a k)))
)
))
ただし 数列${a_n} $ の $k$ 項は (a k)
として求めることができているとする
$a_{n} = 1,2,5,10,17,26\cdots $
$b_{n} = 1,3,5,7,9\cdots $
$c_{n} = 2,2,2,2\cdots $
(define c (lambda (n) 2))
(define b (lambda (n)
(if (= n 1) 1 (+ (b (- n 1)) (c n)))))
(define a (lambda (n)
(if (= n 1) 1 (+ (a (- n 1)) (b (- n 1))))))