ひさしぶりに
d.y.d. の記事に関して.とりあえず cointoss という名前ははなはだまずい(明らかに random() を思い浮かべる).名前を変えるだけでも明瞭さに違いが現れそう.
まあ,名前の問題は置いておくことにして,単純に任意引数の関数を用意するだけでも十分という気はする.
def where_is_max(array) max_i = 0 for i in 1...(array.size) if array[max_i] < array[i] max_i = i elsif array[max_i] == array[i] max_i = arbitrary(max_i, i) end end max_i end
def merge(xs, ys) zs = [] until xs.empty? || ys.empty? if xs[0] < ys[0] zs.push(xs.shift) elsif xs[0] > ys[0] zs.push(ys.shift) else zs.push(arbitrary(xs, ys).shift) end end zs + xs + ys end
将来の言語処理系は以下のプログラムに対して median-of-median とかを持ち出したりするのだろうか.
def partition(array, i, j, pivot) # ... end def qsort(array, i, j) unless i == j k = partition(array, i, j, arbitrary *(i..j)) qsort(array, i, k - 1) qsort(array, k + 1, j) end end
最低要件を満たすだけならば,以下の関数を定義するだけで足りる.実用上の利便を考えてランダムチョイスにしておいたけれど,別に先頭要素を返すだけでも構わない.
def arbitrary(*args) args[rand(args.length)] end