Ruby:递归函数的问题应该从子数组返回最大值的数组

时间:2017-01-28 02:45:35

标签: ruby recursion arrayofarrays

以下函数用于接收数组数组并返回其子数组的最大值。

def temp(list)
  if list.all? { |i| i.kind_of?(Array) }
    return(list.each { |j| j.max })
  else
    return(list)
  end
end

所以给出了这样的列表和函数调用:

x = [[1, 2], [3, 4]]

temp(x)

它应该返回[2,4],但它只返回原始数组[[1,2],[3,4]]。我想知道这里出了什么问题。

由于

3 个答案:

答案 0 :(得分:3)

each对数组的每个元素进行操作,然后返回(原始)数组。您想要的方法是map

def temp(list)
  if list.all? {|i| i.kind_of?(Array) }
    list.map {|j| j.max }
  else
    list
  end
end

x = [[1, 2], [3, 4]]
temp(x)
# => [2, 4]

然而,显式类型检查在Ruby中并不是惯用的,它更喜欢鸭子打字。不要检查i是否为数组;只需检查它是否响应max

def temp(list)
  return list unless list.all? {|i| i.respond_to?(:max) }
  list.map(&:max)
end

答案 1 :(得分:1)

如果放宽all?要求,那么......

试试这个

def temp(list)
  list.map { |l| Array(l).max }
end

这是如何运作的?

  • Array(l)将数组转换为数组
  • 并将其他对象转换为单个元素数组
  • 并将nil变为空数组
  • 因此我们可以随时致电max

答案 2 :(得分:0)

在列表的每个成员上运行代码块后,您将返回列表本身。相反,您可以在函数内部创建另一个列表,并将[Then(@"the expected value is '(.*)'")] public void ThenTheExpectedValueIs(string[] p0) { //ScenarioContext.Current.Pending(); Assert.AreEqual(25, Convert.ToInt32(p0[0])); Assert.AreEqual(36, Convert.ToInt32(p0[1])); Assert.AreEqual(79, Convert.ToInt32(p0[2])); } 值推送到该列表中,并将其返回。

max

这将按预期输出2和4。