3
0

More than 3 years have passed since last update.

part5 Recursive

Posted at

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) $ への代入部分へ

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

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

require

まずは書式

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

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

とりあえず書式

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

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

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

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) $です
さあ、条件分岐を変えないと…

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

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

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

ここでは

index, expected = pair

となってますよ

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

 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でなければ、次の評価を行う.

でこれをつなげて

 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) $を書いていこう

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!ruby-2.5.5p157


  • source ~/my_ruby/grad_members_20f/members/majesty99/for_post/ruby5.org
3
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
3
0