フィボナッチ数列(問題)
-
本日は 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 をしてみる
def fib(n) if n==0 return 0 end end
-
refactoring: assert_equal.rb の assertion(確認)を試しておく
-
-
次は、2 項目を求める
- これは初項と同様に求める
-
次は 3 項目 = 2 項目 + 1 項目
この処理を逐一行っていく。エラーが現れたら随時処理を行っていく
プログラム(最終版)
上記のようにプログラムを書き進めていくと以下のようなプログラムができます
def fib(n)
return 0 if n==0
return 1 if n==1
return fib(n-1) + fib(n-2)
end
require './assert_equal'
# assert_equal.rb は同じディレクトリにある事を想定
[[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, fib(index))
end
class 化
次にクラス化について学習を行ったオブジェクト指向という考え方がある。このキーとなる考え方が,
- 隠蔽(capsulation)
- 継承(inheritance)
- 多形(polymorphism)
である
クラス化とは
簡単にまとめると、オブジェクト指向プログラミングにおけるクラス(英:class)とは、オブジェクトを生成するための設計図あるいはひな形に相当するものである
プログラムをクラス化すると
まずは class なしのプログラム
def puts_hello name
puts "Hello #{name}."
end
def gets_name
name = ARGV[0] || 'world'
return name
end
次にクラスありのプログラム
class Hello
def initialize
# インスタンス変数
@name = gets_name(name)
puts_hello
end
def puts_hello
puts "Hello #{@name}."
end
def gets_name
name = ARGV[0] || 'world'
return name
end
end
インスタンス変数について
- 宣言
変数の初めに「@」をつけることで宣言を行うことができる
- スコープ
インスタンスメソッド内でのみ使用できる変数。インスタンスごとに異なる値を持つことができ、メソッドを超えて参照することができる
参考文献
- source ~/Downloads/git/grad_members_20f/members/taiseiyo/memos/class10.org