2010-10-30 96 views
3

我是编程新手,需要帮助理解我的逻辑和/或语法在以下方法中出现了什么问题...程序应该返回最大值和数组的最小值。我的目标是在方法外部有两个变量(最大值和最小值),以便在方法遍历数组时,值将相应地被替换。感谢您的帮助......最大值和最小值...需要方法返回两个变量值

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

您好!非常感谢您的反馈。我可能应该在问题中表达过这一点,但这纯粹是为了我自己的学习练习。我对此很陌生,并且试图熟悉语法和逻辑。因此,每个人的答案都非常有帮助。我希望今后有更多的反馈和耐心!非常感谢你!如果您知道任何优秀的在线培训/学习材料,请告诉我们! – David 2010-11-01 04:19:46

+0

尝试'list.minmax'它将从列表中返回包含最小值和最大值的数组。 – 2016-05-10 14:06:20

回答

4

使用1.9.1,有最小值

>> list=[4,6,10,7,1,2] 
=> [4, 6, 10, 7, 1, 2] 
>> list.minmax 
=> [1, 10] 
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 
0

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

逻辑有几个问题可以解释为什么你没有得到你期望的结果。

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

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

您需要同时返回最小值和最大值,使递归算法工作,所以我想你需要返回一对值或阵列在一个return语句。其次,您在第3行和第4行初始化的最小和最大变量不在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}" 
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的自动转换多个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}") 

你做的方式是蛮好玩(爱递归性),但它不是真正的优雅,演员的表现不太好,而且有点令人困惑,这远非Ruby视觉。

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。