はじめに
以前に【Oracle】PL/SQLでフィボナッチ数を求めるという記事を書いたので、同様にシェルスクリプト(Bash)でもフィボナッチ数を求めるスクリプトが作れるのではと思い、実際に試してみることにしました。
使用した環境
-
paiza.ioのBashエディタ画面を利用して、作成したスクリプトを実行しました。
- 無料で実行環境を使わせてもらえるのはありがたいですね。
作成したコード
- 最初はPL/SQLと同様に再帰させてフィボナッチ数を求めようと思っていましたが、 シェルスクリプトは戻り値が存在しない ということに気が付いて断念しました。
- 日常的にシェルスクリプトを使っている方には当たり前の話かもしれませんが、たまにしか使わない自分には衝撃的でした...
- そこで、アルゴリズムで天地の差: 計算の手間の「再帰も配列も使わないフィボナッチ数の計算」という章に書かれているRubyのコードを参考にして、再起を使わない方法でフィボナッチ数を求めることにしました。
- なお、参考にしたページでは第2項目~第n項目までのフィボナッチ数を求めていますが、そのアルゴリズムを少し変えて第0項目~第n項目までのフィボナッチ数を求めるコードを作成しました。
- ただし第n項目の「n」が大きくなると処理に時間がかかるため、「0~100までの間のフィボナッチ数を求める」という形に修正しました。
calc_fibonacci.sh
#!/bin/bash
# 再帰も配列も使わず、0~100までの間のフィボナッチ数を返す。
# http://www.aoni.waseda.jp/ichiji/2014/ruby-01/ruby-14-1.html
result=0 # フィボナッチ数の計算結果
p1_result=0 # 1つ前のフィボナッチ数の計算結果
i=0 # ループのカウンタ変数
while true
do
if [ $i -eq 0 ]; then
result=0
elif [ $i -eq 1 ]; then
result=1
p1_result=1
else
p2_result=$p1_result # 1つ前の計算結果を2つ前の計算結果に代入
p1_result=$result # 直前の計算結果を1つ前の計算結果に代入
result=$(($p1_result+p2_result))
fi
if [ $result -gt 100 ]; then # 計算結果が100より大きい時は処理を抜ける。
break
fi
echo $result
i=$((i + 1))
done
実行結果
実行結果
0
1
2
3
5
8
13
21
34
55
89