バリケンのRuby日記 RSSフィード

2008-03-21

[] cond式  cond式 - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  cond式 - バリケンのRuby日記  cond式 - バリケンのRuby日記 のブックマークコメント

今日は、複数の場合分けができるcond式について勉強するよ。

cond式

condは、複数の条件の場合分けに使うよ。condは順番に条件を評価して、最初にnil以外となった条件の式を評価するよ。具体的には、

(cond
 (条件1 式1)
 (条件2 式2)
 (条件3 式3)
 (条件4 式4)
 ...
)

という感じだね。

Rubyで同じことをするには、

case
when 条件1
  式1
when 条件2
  式2
when 条件3
  式3
when 条件4
  式4
...
end

だね。

じゃあ、cond式を使ってフィボナッチ数列を求める関数fibを定義してみよう!フィボナッチ数列の定義は

fib(0) = 0
fib(1) = 1
fib(n) = fib(n-1) + fib(n-2)

だよね。だから、0のとき、1のとき、それ以外、をcond式で場合分けをすればいいよね。「それ以外」を表したいときは、一番最後に評価される条件を「t」にすればいいみたい。そうすることで「今までマッチしなかった条件以外すべて」が表せるんだね。Rubycase式の一番最後のelseに相当するね。

今回新しく出てきた「=」という関数は、引数が等しいかどうかを判定する関数だよ。引数がすべて等しければtが、引数に異なるものがあればnilが返るよ。

[1]> (defun fib (n)
(cond
  ((zerop n) 0)
  ((= n 1) 1)
  (t (+ (fib (1- n)) (fib (- n 2))))))
FIB
[2]> (fib 10)
55
[3]>

Rubyで同じものを書くと、次のような感じになるよ。

def fib(n)
  case
  when n.zero?
    0
  when n == 1
    1
  else
    fib(n - 1) + fib(n - 2)
  end
end

次のように書いてもいいかも。

def fib(n)
  case n
  when 0
    0
  when 1
    1
  else
    fib(n - 1) + fib(n - 2)
  end
end
トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20080321