在ruby中创建max方法

时间:2017-06-15 03:03:39

标签: ruby

请给我一点帮助。

从数组中返回最大数字,而不使用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

4 个答案:

答案 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_byEnumerable#min_byEnumerable#minmax

更多精神,我们可以做这样的事情:

def max items
  m = items[0]
  items[1..items.length-1].each { |n| m = n if n > m }
  m
end

这假定第一个元素是最大元素,然后从左到右遍历所有剩余元素,如果遇到更大的数字m,则替换最大值n