数列

1,3,5,7,9,11,13,15,....

とか

1,2,4,8,16,32,64,128,....

とか

数列の基本

  • 初項 : 1番目の数(最初の数)
  • 第2項 : 2番目の数
  • 第3項 : 3番目の数
  • ...
  • 第n項 : n番目の数

数列

1,3,5,7,9,11,13,15,....

  • 初項 : 1
  • 第2項 : 3
  • 第3項 : 5
  • 第100項 :???

数列

1,3,5,7,9,11,13,15,....

規則性を見つけられれば どんな n に対しても 第n項が得られるはず

数列に対して nを与えて 第n項を得ることは 数列の一般項を求めるという

数列

みなさんが勉強したやつ

等差数列

となりあった数の差が等しい

等比数列

となりあった数の比が等しい

数列

等差数列

等比数列

それぞれ、数列の一般項や 初項から第n項までの和を求める方法を勉強したはず 公式として覚えた?
プログラミングでは 公式使わないで、計算します
数列を漸化式(ぜんかしき)で 表すことができれば
それは 即 プログラムになって
実行することができます

等差数列

初項1、等差2の等差数列
1,3,5,7,9,11,13,15,....

この数列の第n番目の数を返す プログラム(関数,あるいは手続きといってもよいけど) が tosa-1-2 として できているとすると
(tosa-1-2 1) は 1 です
(tosa-1-2 2) は 3 です
(tosa-1-2 3) は 5 です

再帰のプログラム

プログラムができていたらよいなあと

名前をつける

この考え方が重要

等差数列

初項1、等差2の等差数列

この数列の第n番目の数を返す プログラム(関数,あるいは手続きといってもよいけど) が tosa-1-2 として できているとすると
(tosa-1-2 1) は 1 
(tosa-1-2 2) は 3 
(tosa-1-2 3) は 5 

初項1、等差2の等差数列
1,3,5,7,9,11,13,15,....

tosa-1-2 とすると

tosa-1-2という手続き

第1項は (tosa-1-2 1)

1

tosa-1-2という手続き

第2項は (tosa-1-2 2)

3

tosa-1-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より大きいと 数を返してくれません
第1項(初項)は 1ですが 等差数列のお約束では

第2項は 1 に 2を足したものです (第2項 と 第1項 の差が 2というのがが等差数列のお約束)

第3項は 第2項 に 2を足したものです

第4項は 第3項 に 2を足したものです

なので 
第n項は 第(n-1)項 に 2を足したものです

tosa-1-2という手続き

第n項は (tosa-1-2 n)

tosa-1-2という手続き

第n-1項は (tosa-1-2 (- n 1))
第1項は 1、それ以外の
第n項は 第(n-1)項 に 2を足したもの
をそのままプログラムしたものが
(define tosa-1-2 (lambda (n)
  (cond ((= n 1) 1)
        (else (+ (tosa-1-2 (- n 1)) 2)))))

tosa-1-2という手続き

第n-1項は (tosa-1-2 (- n 1))
第1項は 1、それ以外は
一つ前の値 に 2を足したもの

特別

第1項は 1

一般には


第n項は 第(n-1)項 に 2を足したもの

第n項は 第(n-1)項 に 2を足したもの

(+ (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)と呼びます。
tosa-1-2の定義している最中に tosa-1-2を呼び出していますが、 呼び出すときに 1少ない値で呼び出しているので いつか必ず 初項に辿りつきます。 なので、大丈夫です
最初に呼びだした引数が1かどうかをチェックしないと
(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)
とどこまでも、呼び出していって止まりません。
なので 定義の最初で止まる条件をチェックする ことが重要です

1,2,4,8,16,32,64,128,....

初項1、公比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. $ \;\; a_1 = 1,\; a_{n+1} = a _{n} + 3 $

    初項1,等差3 の 等差数列

  2. $ \;\; a_1 = 1,\; a_{n+1} = 2 a _{n}$

    初項1,公比2 の 等比数列

  3. $ \;\; a_1 = 1,\; a_{n+1} = a_{n} + 2n - 1 $
  4. $ \;\; a_1 = 1,\; a_{n+1} = a_{n} + n^{2} $

$ a_1 = 1,\; a_{n+1} = a_{n} + 3 $

は、このようにも書ける

\[ a_{n} = \left\{ \begin{array}{ll} 1 & (n=1) \\ a_{n-1} + 3 & ( n \neq 1) \end{array} \right. \]
\[ a_{n} = \left\{ \begin{array}{ll} 1 & (n=1) \\ a_{n-1} + 3 & ( n \neq 1) \end{array} \right. \]

以下のプログラムとほとんど同じ


(define a (lambda (n)
    (cond ((= n 1) 1)
          (else (+ (a (- n 1)) 3))
    )
))

\[ a_{n} = \left\{ \begin{array}{ll} 1 & (n=1) \\ a_{n-1} + 2n - 3 & ( n \neq 1) \end{array} \right. \]

(define a (lambda (n)
    (cond ((= n 1) 1)
          (else (+ (a (- n 1)) (* 2 n) -3))
    )
))

数列の和

数列 ${a_n} $ の $k$ 項まで

$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} $
数列 ${a_n} $ の $k$ 項までの和 を $ S_{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 だ $

つまり

数列 ${a_n} $ の $k$ 項までの和 を $ S_{k} $とすると \[ S_{k} = \left\{ \begin{array}{ll} a_1 & (k=1) \\ S_{k-1} + a_k & ( k \neq 1) \end{array} \right. \]
数列 ${a_n} $ の $k$ 項までの和 を (sum k) とすると
(define sum (lambda (k)
  (cond ((= k 1) (a 1))
        (else (+ (sum (- k 1)) (a k)))
  )
))
ただし 数列${a_n} $ の $k$ 項は (a k) として求めることができているとする

階差数列

数列 $\{a_n\} $ に対して $$ b_n = a_{n+1} - a_n \; ( n = 1,2,3,\cdots ) $$ を階差といい、 それらの作る数列 $\{b_n\}$ を元の数列の階差数列という

$a_{n} = 1,2,5,10,17,26\cdots $

$b_{n} = 1,3,5,7,9\cdots $

$c_{n} = 2,2,2,2\cdots $


$b_{n}$ は $a_{n}$ の 1階の階差数列
$c_{n}$ は $a_{n}$ の 2階の階差数列 ($c_{n}$ は $b_{n}$ の 1階の階差数列)
(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))))))