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