我是编码的新手,需要帮助理解我的逻辑和/或语法在下面的方法中有什么问题...程序应该返回数组的最大值和最小值。我的目标是在方法之外有两个变量(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))
答案 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)
答案 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。