フィボナッチ数の最初の4項を表示するスクリプト(whileとか使わないバージョン)
01 #!/bin/bash 02 n=1 03 c=0 04 echo $c 05 n=$(( n + 1 )) 06 b=$c 07 c=1 08 echo $c 09 n=$(( n + 1 )) 10 a=$b 11 b=$c 12 c=$(( a + b )) 13 echo $c 14 n=$(( n + 1 )) 15 a=$b 16 b=$c 17 c=$(( a + b )) 18 echo $c
実行するスクリプトには行番号など付いていないが,ここに示したものは先頭に行番号を書いた.
スクリプトの01行目はシェルスクリプトのおまじない. 本体は02行目以降である.
このスクリプトでは,n, a, b, c という4つの変数が使われている. 変数 n は数列の第n項の n の値を入れるための入れ物である.第5項であれば,n に 5 を代入する. 変数 a, b, c はそれぞれ数列の第n-2項,第n-1項,第n項の値を入れるための入れ物である.n=5 であるなら,a には第3項,b には第4項,c には第5項,の値を代入する.
02-04行は第1項,05-08行が第2項,09-13行が第3項,14-18行が第4項,をそれぞれ計算・表示している.
コードは前から順番に実行されるので,前から順番に見ていく.
まず,02-04行. 各行がやることは,
02 変数 n に 1 を代入する 03 変数 c に 0 を代入する 04 変数 c の値を表示する
意味を考えて書き直すなら,
02 第1項の処理をおこなうので,n に 1 を代入する 03 第n項の値が代入されるべき入れ物(変数 c)に第n項の値を代入する.03行目開始時(02行目終了時)に,n=1 なので,第1項の値を変数 c に代入する.第1項の値は 0 と定義されているので,c に 0 を代入する. 04 第n項の値を表示する.n=1 なので,第1項の値を表示する.
である.
ここまで進んだところで,各変数に代入されている値は以下のようになる.
n : 1 a : b : c : 0
変数 a と b には何も代入していないので,それらは不定である.
次に,05-08行. 各行がやることは,
05 変数 n に 1 を加えたものを,変数 n に代入する 06 変数 b に変数 c の値を代入する 07 変数 c に 1 を代入する 08 変数 c の値を表示する
これも意味を考えて書き直すと,
05 第n項の次の項,第n+1項の処理をおこなうので,n に 1 を加えたものを n に代入する.05行目開始時(04行目終了時)に,n=1 なので,n には 2 が代入される. 06 第n-1項の値が代入されるべき入れ物(変数 b)に第n-1項の値を代入する.06行目開始時(05行目終了時)に,n=2 なので,第1項の値を変数 b に代入する.第1項の値は変数 c に代入されている(03行目に第1項の値を代入した後に変更されていない)ので,c の値を b に代入する. 07 第n項の値が代入されるべき入れ物(変数 c)に第n項の値を代入する.n=2 で,第2項の値は 1 と定義されているので,c に 1 を代入する 08 第n項の値を表示する.n=2 なので,第2項の値を表示する.
ここまで進んだところで,各変数に代入されている値は以下のようになる.
n : 2 a : b : 0 c : 1
変数 a には何も代入していないので,それは不定である.
次に,09-13行. 各行がやることは,
09 変数 n に 1 を加えたものを,変数 n に代入する 10 変数 a に変数 b の値を代入する 11 変数 b に変数 c の値を代入する 12 変数 c に変数 a と b の値を足したものを代入する 13 変数 c の値を表示する
これも意味を考えて書き直すと,
09 第n項の次の項,第n+1項の処理をおこなうので,n に 1 を加えたものを n に代入する.09行目開始時(10行目終了時)に,n=2 なので,n には 3 が代入される. 10 第n-2項の値が代入されるべき入れ物(変数 a)に第n-2項の値を代入する.10行目開始時(09行目終了時)に,n=3 なので,第1項の値を変数 a に代入する.第1項の値は変数 b に代入されている(06行目で第1項の値を代入した後に変更されていない)ので,b の値を a に代入する. 11 第n-1項の値が代入されるべき入れ物(変数 b)に第n-1項の値を代入する.11行目開始時(10行目終了時)に,n=3 なので,第2項の値を変数 b に代入する.第2項の値は変数 c に代入されている(07行目で第2項の値を代入した後に変更されていない)ので,c の値を b に代入する. 12 第n項の値が代入されるべき入れ物(変数 c)に第n項の値を代入する.第n項の値は第n-2項と第n-1項の和として定義される.第n-2項と第n-1項の値はそれぞれ変数 a と b に代入されているので,a+b を c に代入する. 13 第n項の値を表示する.n=3 なので,第3項の値を表示する.
ここまで進んだところで,各変数に代入されている値は以下のようになる.
n : 3 a : 0 b : 1 c : 1
次に,14-18行. 各行がやることは,
14 変数 n に 1 を加えたものを,変数 n に代入する 15 変数 a に変数 b の値を代入する 16 変数 b に変数 c の値を代入する 17 変数 c に変数 a と b の値を足したものを代入する 18 変数 c の値を表示する
これも意味を考えて書き直すと,
14 第n項の次の項,第n+1項の処理をおこなうので,n に 1 を加えたものを n に代入する.14行目開始時(13行目終了時)に,n=3 なので,n には 4 が代入される. 15 第n-2項の値が代入されるべき入れ物(変数 a)に第n-2項の値を代入する.15行目開始時(14行目終了時)に,n=4 なので,第2項の値を変数 a に代入する.第2項の値は変数 b に代入されている(11行目で第2項の値を代入した後に変更されていない)ので,b の値を a に代入する. 16 第n-1項の値が代入されるべき入れ物(変数 b)に第n-1項の値を代入する.16行目開始時(11行目終了時)に,n=4 なので,第3項の値を変数 b に代入する.第3項の値は変数 c に代入されている(12行目で第3項の値を代入した後に変更されていない)ので,c の値を b に代入する. 17 第n項の値が代入されるべき入れ物(変数 c)に第n項の値を代入する.第n項の値は第n-2項と第n-1項の和として定義される.第n-2項と第n-1項の値はそれぞれ変数 a と b に代入されているので,a+b を c に代入する. 18 第n項の値を表示する.n=4 なので,第4項の値を表示する.
ここまで進んだところで,各変数に代入されている値は以下のようになる.
n : 4 a : 1 b : 1 c : 2