作者: Bruce.
日時: 2006/6/30(11:25)
Bruce.です。

某所でRubyではないのですが(Java)、「再帰を使って2番目に大きい要素を求めよ」
といった感じのお題を見かけました。今ひとつ明確でない部分があるのですが、多分
配列(リスト)が対象でソートせずに求めろということだろうと判断して
ちょっとRubyでやってみました。


def getmax(ary)
  return ary[0] if ary.length == 1
  
  x = ary[0]
  y = getmax(ary[1..-1])
  
  #puts "x=#{x}, y=#{y}"
  return x > y ? x : y
end

def get2nd(ary)
  return ary[0] if ary.length == 1
  return min(ary[0], ary[1]) if ary.length == 2
  
  x = getmax(ary)
  y = getmax(ary.reject{|e| e==x })
  
  return x > y ? y : x
end

ary = []
DATA.each do |e|
  ary << e.to_i
end

puts ary
puts "###"
print "#{getmax(ary)}, #{ary.sort[-1]}\n"
print "#{get2nd(ary)}, #{ary.sort[-2]}\n"

#made by
# ruby -e "srand(4649); (1..15).each{|e| puts ((rand()*1000).to_i)}"
__END__
238
212
889
625
870
566
814
704
389
50
679
277
794
314
240

getmaxをもっと関数型言語っぽく書けよというおしかりは甘んじて受けますが(^^;、
2番目を取り出すのに2回getmaxするのは美しくありません。
なんかいい手はないでしょうか?

いじょ。