第34回 Ruby/Rails 勉強会 - 演習 3

演習問題のつづき。

イナリサーチ再帰で実装してください。

class Array
  def bsearch(o, n = 0)
    return nil  if empty?

    i = size/2
    if self[i] == o
      i+n
    elsif self[i] > o
      self[0,i].bsearch(o, n)
    else
      self[i+1,i].bsearch(o, n+i+1)
    end
  end
end

a = (0..9).to_a             # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
(0..9).each do |i|
  a.bsearch i               # => 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
end

even = a.select{|i|i%2==0}  # => [0, 2, 4, 6, 8]
(0..9).each do |i|
  even.bsearch i            # => 0, nil, 1, nil, 2, nil, 3, nil, 4, nil
end

odd = a.reject{|i|i%2==0}   # => [1, 3, 5, 7, 9]
(0..9).each do |i|
  odd.bsearch i             # => nil, 0, nil, 1, nil, 2, nil, 3, nil, 4
end

String#[](start, length) って始めて使った気がする。