最大值和最小值...需要返回两个变量值的方法

时间:2010-10-30 10:19:41

标签: ruby

我是编码的新手,需要帮助理解我的逻辑和/或语法在下面的方法中有什么问题...程序应该返回数组的最大值和最小值。我的目标是在方法之外有两个变量(max和min),这样当方法遍历数组时,值会相应地被替换。谢谢你的帮助...

    list=[4,6,10,7,1,2]

max=list[0]
min=list[0]

def maxmin(list)

  f=list.shift
  if list.empty?then
      return max = f 
      return min = f
  end

  t=maxmin(list)
  if(f>t) then
    return max = f 
    return min = t
  else
    return max = t 
    return min = f
  end

end

printf("max=#{max}, min=#{min}, method return=%d\n", maxmin(list)) 

5 个答案:

答案 0 :(得分:4)

使用1.9.1,有minmax

>> list=[4,6,10,7,1,2]
=> [4, 6, 10, 7, 1, 2]
>> list.minmax
=> [1, 10]

答案 1 :(得分:3)

Max和Min方法已经在Stdlib或ruby中

所以使用它

list.max
list.min

答案 2 :(得分:3)

编辑:你的问题只是关于返回两个变量?如果是这样,只需用逗号分隔它们,它们将作为数组返回:

return min_value, max_value

要添加已编写的内容(是的,使用内置库),修改它们正在使用的方法之外的变量通常是一个坏主意。请注意,在框架调用中,新值是被退回。这使得调用方法的人可以决定如何处理这些值,而不是假设变量存在然后一直更改它们的方法。

如果我必须写它(我是Ruby的新手,所以我可能不会尽可能优雅地做到这一点,但它应该很容易理解),我会这样写:

def find_min_max(list)
  if (list.nil? || list.count == 0)
    return nil, nil
  end

  min = list.first
  max = list.first

  list.each do |item|
    if item.nil?
      next
    elsif item < min
      min = item
    elsif item > max
      max = item
    end
  end

  return min, max
end

list = [1, 439, 2903, 23]
min_max = find_min_max list

p min_max

答案 3 :(得分:0)

我同意给出的其他答案。除了编程练习之外,编写这种方法毫无意义。

逻辑上有一些问题可能解释了为什么你没有得到你期望的结果。

首先有3对return语句,其中第二个将永远不会被调用,因为该方法已经返回,例如

return max = f
return min = f # never gets called

你需要返回最小值和最大值以使递归算法工作,所以我猜你需要在一个return语句中返回一对值或一个数组。

其次,在第3行和第4行初始化的min和max变量不在minmax方法体内,因此您实际上是在那里定义新的局部变量。

如果您调整代码,最终可能会遇到类似的问题,但这不是您需要在生产中编写的方法,我相信有更好的方法可以实现:

list = [4,6,10,7,1,2]

def maxmin(list)
  f = list.shift
  if list.empty?
    return f, f
  end

  max, min = maxmin(list)
  return f > max ? f : max, f < min ? f : min
end

max, min = maxmin(list)
puts "min = #{min}, max = #{max}"

答案 4 :(得分:0)

问题在于您尝试使用全局变量(称为:@ max,@ min),但您希望代码分配您甚至不能分配的值。由于可访问性,您最好选择全局的局部变量(如果可能的话)。

第二个问题是,在使用全局变量的情况下,您不必返回任何内容。例如:

@value = 0

def test
  @value = 1
end

puts @value ==> 0
test # change @value to 1
# it also return 1 because ruby return last statement value
puts @value ==> 1

如果您使用局部变量,则应返回多个结果。 在Ruby完成工作的地方,Ruby自动将多个return语句转换为数组,并将数组转换为多个变量赋值)

list = [4,6,10,7,1,2]

def maxmin(list)

  f = list.shift
  if list.empty? then
      return f, f # f is the minimum and the maximum of a list of one element
  end

  mi, ma = maxmin(list)
  if (f > ma) then
    ma = f
  elsif (f < mi)
    min = f
  end

return mi, ma
end

min, max = maxmin(list)
printf("max=#{max}, min=#{min}") 

你的行为方式非常有趣(喜欢递归),但它不是很优雅,表演并不是很好,而且它有点令人困惑,远非红宝石的愿景。

list = [4,6,10,7,1,2]

def minmax(list)
  max = list[0]
  min = list[0]

  list.each do |elem|
    if elem > max then
      max = elem
    elsif elem < min
      min = elem
    end
  end

  return min, max
end

min, max = minmax(list)
printf("max=#{max}, min=#{min}") 

是一个更清晰的代码版本,即使不那么酷。您可以使用全局变量尝试这些答案,这应该很容易。

显然,由于Ruby的愿景,当您完成此操作时,欢迎您使用Array.max和Array.min。