重构一个方法来查找任意数量的参数RUBY的最大值

时间:2017-10-04 08:54:02

标签: ruby methods

最初的任务是定义一个名为max的方法,该方法将两个数字作为参数并返回其中最大的一个。现在我需要重构max方法以查找任何最大值参数数量。我难倒了

这是第一个返回最大数字的任务的代码:

 def max(num1, num2)
  num1 = 2
  num2 = 3
  if num1 < num2
    return num2
  end
end

3 个答案:

答案 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 }}。默认情况下,memoargs[0]开头,在这种情况下为2objargs[1]开头,即3

第一步:

  • memo2; obj是3;
  • memo3,因为3&gt; 2

第二步:

  • memo3; obj9;
  • memo9,因为9&gt; 3

第三步:

  • memo9; obj5;
  • memo9,因为9&gt; 5

第四步:

  • memo9; obj4;
  • memo9,因为9&gt; 4

。 。

第七步:

  • memo10; obj是8;
  • memo10,因为10&gt; 8

最终的新memoreduce返回的内容,当然是最大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