part5 Recursive



# Fibonacci数列

今回の目的であるFiobonacci数列$$ a(n) = a(n-1) + a(n-2) $$$$ a(1) = 0, a(2) = 1, a(3)= 2, a(4) = 3 ... $$

をrecursion(再帰)で求めよう
前回のassert\_equalのプログラムをここで使います。


ちなみに

    $$ 数式 $$
    $ 数式 $　

で$$で囲むと上記の数式みたくかっこよく見えます。二行目は中央に表示ではなく、文中にかっこ良く見せるやつです。個人的にそう見せたいのですごく多用してます。普通に書くよりこっちのほうがいいと思いませんか？~~思いませんね~~スタイリッシュ(Looks Good To Me)にしていこう。


## 解いてみよう

まずは初項、第二項とについて
$ a(0) = 0, a(1) = 1 $なので、早速これを判定するプログラムを書いていこう関数$ a(n) $ への代入部分へ

```ruby
def a(n)
  if n == 0
    return 0
  end
  if n == 1
    return 1
  end
end
```

よし、代入部分はかけたので次は表示するプログラムも書いていこう。ってことはpart4のコピペだ！GO!
でもいいですがもっといい方法ありますよ


## require

まずは書式

    require './拡張子を除いたファイル名'

これを表記しておくことで、そのファイル内のものを実行してくれる。
**<font color=Red>めっちゃ楽</font>**
重要なのは実行するファイルと、requireのファイルを同じディレクトリにいれておく必要があることです。(拡張子を記述しても実行されるが、どっちがいいのだろうか）しかし、このままだと引用したファイルが実行されるので


とりあえず書式

    if $PROGRAM_NAME == __FILE__
      FILE名...
      FILE名...
    end

ファイル名(FILE)と動いているファイル名(PROGRAM\_FILE)と一致したときに実行。

さてこれらを用いて表示部分や、判定部分を表記。

```ruby
def a(n)
  if n == 0
    return 0
  end
  if n == 1
    return 1
  end
end

require './asse3'

[[0,0],[1,1]].each do |pair|
  puts assert_equal(pair[0], fib(pair[1]))
end
```

asse3はpart4に作ったファイルです。~~2回は改訂されてます~~

実行結果は

    $ruby fib.rb
    {expected, result} ={0, 0}
    succeeded in assert_equal. #赤色の文字です
    
    {expected, result} ={1, 1}
    succeeded in assert_equal.　#赤色の文字です

こういう貼り付けのところの任意の色付けはほんとにわからない。
めがっさちなみにな内容ですが。普通の文章において文字に色を付けるには

    <font color='色'>テキスト</font>

です。


## 第三項

まず第三項は$ a(3) = a(1) + a(2) $です
さあ、条件分岐を変えないと&#x2026;

```ruby
 def a(n)
  if n == 0
    return 0
  end
  if n <= 2
    return 1
  end
end 
```

$ n $が2以上なら$ a(n) $は1という文に変わってます。さて、表示部分もpairではわかりにくいので示数(index)として

```ruby
require './asse3'
[[0,0],[1,1],[2,1]].each do |index, expected|
  puts assert_equal(expected, a(index))
end
```

ここでは

    index, expected = pair

となってますよ

このままでいくとif文はどんどん長くなるのでは？
という疑問が出てくる。分けたのにゴチャついてるとは意味がないのですっきりさせる方法がある。

```ruby
 def a(n)
  return 0 if n == 0
  return 1 if n <= 2
end 
```

すげえスッキリしたじゃん
とはなるけど、これどうゆうことなの？

まずは一般的に

    eq1 if eq2

はeq2を見て、真ならばeq1を評価する、偽なら何もしないなので

    return 0  if n == 0

のときは、nが0ならばreturnが実行されて 0が返る。nが0でなければ、次の評価を行う.

でこれをつなげて

```ruby
 def a(n)
  return 0 if n == 0
  return 1 if n <= 2
end

require './asse3'

[[0,0],[1,1],[2,1]].each do |index, expected|
  puts assert_equal(expected, a(index))
end
```


## 一般式

$ a(n) = a(n-1) + a(n-2) $を書いていこう

```ruby
def a(n)
  return 0 if n == 0
  return 1 if n == 1
  return a(n-1) + a(n-2)
end

require './asse3'

[[0,0],[1,1],[2,1],[3,2],[4,3],
 [5,5],[6,8],[7,13],[8,21]].each do |index, expected|
  puts assert_equal(expected, a(index))
end
```

    $ruby fib.rb
    {expected, result} ={0, 0}
    succeeded in assert_equal.
    
    {expected, result} ={1, 1}
    succeeded in assert_equal.
    
    {expected, result} ={1, 1}
    succeeded in assert_equal.
    
    {expected, result} ={2, 2}
    succeeded in assert_equal.
    
    {expected, result} ={3, 3}
    succeeded in assert_equal.
    
    {expected, result} ={5, 5}
    succeeded in assert_equal.
    
    {expected, result} ={8, 8}
    succeeded in assert_equal.
    
    {expected, result} ={13, 13}
    succeeded in assert_equal.
    
    {expected, result} ={21, 21}
    succeeded in assert_equal.

やったぜ。


# 参考文献

[チャート式ruby-Ⅴ(Recursive Fibonacci](https://qiita.com/daddygongon/items/1bb27b8920c201d5c520)\![ruby-2.5.5p157](<https://img.shields.io/badge/ruby-2.5.5p157-brightgreen>) 



------
 - **source** ~/my_ruby/grad_members_20f/members/majesty99/for_post/ruby5.org