LoginSignup
1
0

More than 1 year has passed since last update.

シェルスクリプトでフィボナッチ数を求める

Posted at

はじめに

以前に【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

参考URL

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0