请给我一点帮助。
从数组中返回最大数字,而不使用max。让测试通过。不要使用max,for或while。
def max(items)
# your code here
end
puts max([1,2,3,4,5,6]) == 6
puts max([4,5,6,1,2,3]) == 6
puts max([9,8,7,6,5,3,1]) == 9
这是我第一次尝试的代码。我很新,可能会离开基地。另外,我确信它不完整。 不知道为什么我在这个问题上得到这么多的投票。也有人可以解释一下。
def max(items)
x = items.each
if x > items
items = x
x
end
end
答案 0 :(得分:2)
您可以使用sort
吗?
def max(items)
items.sort.last
end
p max([1,2,3,4,5,6]) # => 6
p max([4,5,6,1,2,3]) # => 6
p max([9,8,7,6,5,3,1]) # => 9
答案 1 :(得分:2)
我觉得这个很干净,并且本着练习的精神:
a = [9, 8, 7, 6, 5, 3, 1]
a.reduce { |a, b| a > b ? a : b }
#=> 9
答案 2 :(得分:1)
递归效率低于迭代提议,但仍然很有趣:
def max(items)
return nil if items.size < 1 # no data, no answer
return items[0] if items.size < 2 # one element is trivially the max
mid = items.size / 2 # otherwise, find the midpoint of the array
first_half_max = max(items[0...mid]) # recursively find max of 1st half
second_half_max = max(items[mid..-1]) # recursively find max of 2nd half
first_half_max < second_half_max ? second_half_max : first_half_max # pick the larger
end
我采用了一种方法,将列表切成两半而不是更容易&#34;将第一个元素与其余的最大值进行比较&#34;。这个可以控制递归深度,即使对于非常大的列表也不会给出堆栈溢出。
答案 3 :(得分:0)
遵守法律条文,但也许违背了精神:
def max items
items.max_by(&:itself)
end
或
def max items
items.min_by { |i| -i }
end
或
def max items
items.minmax.last
end
都提供以下输出:
puts max([1,2,3,4,5,6]) # 6
puts max([4,5,6,1,2,3]) # 6
puts max([9,8,7,6,5,3,1]) # 9
有关详细信息,请参阅Enumerable#max_by
,Enumerable#min_by
和Enumerable#minmax
。
更多精神,我们可以做这样的事情:
def max items
m = items[0]
items[1..items.length-1].each { |n| m = n if n > m }
m
end
这假定第一个元素是最大元素,然后从左到右遍历所有剩余元素,如果遇到更大的数字m
,则替换最大值n
。