最初的任务是定义一个名为max的方法,该方法将两个数字作为参数并返回其中最大的一个。现在我需要重构max方法以查找任何最大值参数数量。我难倒了
这是第一个返回最大数字的任务的代码:
def max(num1, num2)
num1 = 2
num2 = 3
if num1 < num2
return num2
end
end
答案 0 :(得分:1)
假设您不允许使用Array#max
,您可以执行以下操作:
def maxx *args
args.reduce { |memo, obj|
obj > memo ? obj : memo
}
end
p maxx 2,3,9,5,4,3,10,8
#=> 10
这是一个稍微冗长,未重构的版本,可能更容易阅读。 *args
将所有参数捕获到数组args
中。在示例中args = [2, 3, 9, 5, 4, 3, 10, 8]
。
def maxx(*args)
args.reduce {|memo, obj|
if obj > memo
memo = obj
else
memo = memo
end
}
end
p maxx(2,3,9,5,4,3,10,8)
#=> 10
仅当reduce
大于当前obj
时, args
才会从您的memo
数组中查看每个元素obj
,并将其存储为新的memo
}}。默认情况下,memo
以args[0]
开头,在这种情况下为2
。 obj
以args[1]
开头,即3
。
第一步:
memo
是2
; obj是3; memo
为3
,因为3&gt; 2 第二步:
memo
是3
; obj
是9
; memo
为9
,因为9&gt; 3 第三步:
memo
是9
; obj
是5
; memo
为9
,因为9&gt; 5 第四步:
memo
是9
; obj
是4
; memo
为9
,因为9&gt; 4 。 。
第七步:
memo
是10
; obj
是8; memo
为10
,因为10&gt; 8 最终的新memo
是reduce
返回的内容,当然是最大10
。有关Array#reduce
的更多信息。在重构的原始答案中,我使用了ternary operator
,这基本上是编写简单if-expression
的简短方法。
答案 1 :(得分:1)
请检查:
方法定义:
def find_max *input
return input.max
end
方法调用并获取所提供输入数字的最大值:
puts find_max(1,4,2,3)
puts find_max(8,5,9,2,0,14,1)
答案 2 :(得分:0)
假设我们不允许使用Array#max,我们只需要检查两个号码。我最好使用这个,
def max (a,b)
a>b ? a : b
end
如果我们可以使用Array#max和任意数量的参数,
array = [a, b, c, ...]
def max(array)
array.max
end