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するのは美しくありません。
なんかいい手はないでしょうか?
いじょ。