フィボナッチ数列(問題)
本日は Fibonacci 数列についての問題を解く
fib(n) = fib(n-1)+fib(n-2) 0 1 1 2 3 5 8 13 21 ...
を recursion(再帰)で求めよ
進め方
前回と同様に テスト駆動開発で今後の学習を進めて行く
まずは初項から計算を行う
- red: 表示を行うred → p fib(0)エラーがおこる
green: def をしてみる
deffib(n)ifn==0return0endend
refactoring: assert_equal.rb の assertion(確認)を試しておく
次は、2 項目を求める
- これは初項と同様に求める
次は 3 項目 = 2 項目 + 1 項目
この処理を逐一行っていく。エラーが現れたら随時処理を行っていく
プログラム(最終版)
上記のようにプログラムを書き進めていくと以下のようなプログラムができます
deffib(n)return0ifn==0return1ifn==1returnfib(n-1)+fib(n-2)endrequire'./assert_equal'# assert_equal.rb は同じディレクトリにある事を想定[[0,0],[1,1],[2,1],[3,2],[4,3],[5,5],[6,8],[7,13],[8,21]].eachdo|index,expected|putsassert_equal(expected,fib(index))end
class 化
次にクラス化について学習を行ったオブジェクト指向という考え方がある。このキーとなる考え方が,
- 隠蔽(capsulation)
- 継承(inheritance)
- 多形(polymorphism)
である
クラス化とは
簡単にまとめると、オブジェクト指向プログラミングにおけるクラス(英:class)とは、オブジェクトを生成するための設計図あるいはひな形に相当するものである
プログラムをクラス化すると
まずは class なしのプログラム
defputs_hellonameputs"Hello #{name}."enddefgets_namename=ARGV[0]||'world'returnnameend
次にクラスありのプログラム
classHellodefinitialize# インスタンス変数@name=gets_name(name)puts_helloenddefputs_helloputs"Hello #{@name}."enddefgets_namename=ARGV[0]||'world'returnnameendend
インスタンス変数について
- 宣言
変数の初めに「@」をつけることで宣言を行うことができる
- スコープ
インスタンスメソッド内でのみ使用できる変数。インスタンスごとに異なる値を持つことができ、メソッドを超えて参照することができる
- source ~/Downloads/git/grad_members_20f/members/taiseiyo/memos/class10.org