[ 岡山大学 | 理学部 | 地球科学科 | 地球および惑星大気科学研究室 ]

2020年度 大気科学演習1

フィボナッチ数を表示するスクリプトの解説

フィボナッチ数の最初の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




Last Updated: 2020/10/30, Since: 2020/10/30.
This page is generated by Makefile.rd2html.