使用.any方法迭代数组组合方法

时间:2014-10-01 04:37:17

标签: ruby combinations enumerable any

无论如何都要迭代不同的数组组合吗?

我编写的程序如果数组中的最大数字可以是数组中任何成员的总和,则返回true。

这是我的代码:(原谅我,2周前我学会了如何编程)

def ArrayAdditionI(arr)
arr=arr.sort
largest=arr.pop
n=arr.length
  for i in 1..n
    if arr.combination(i).to_a.any? {|array| array.inject(:+)==largest}
      return true
    else
      return false
    end
  end
end

我测试了它     a = [1,2,3,4] 即使清楚,3 + 1 = 4,它也会返回false。 当我将上面的代码从arr.combination(i)更改为arr.combination(2)时,它返回true。所以我猜测它与组合方法无法循环有关。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

你有return false错误的地方。实际上,返回false是没有一个元素的组合(即,除了你在排序后删除的元素之外的一个元素)的总和(即,等于)largest。相反,只有当没有任何大小的组合汇总到false时,您才想返回largest。这就是你需要的:

def max_match?(arr)
  arr=arr.sort
  largest=arr.pop
  n=arr.length
  for i in 1..n
    return true if arr.combination(i).any? {|array|
      array.inject(:+)==largest}
  end
  false
end

arr = [1,4,7,3,5,2,13]
max_match?(arr) #=> true
arr = [1,3,4,7,59]
max_match?(arr) #=> false

一些注意事项:

  • 小写字母和可选下划线用于方法名称。您还可以在结尾处添加问题(?)或说明(!)标记。这里的问号似乎是合适的。
  • to_a不需要。可枚举的方法(例如any?)可以将枚举数作为接收者。
  • 分拣是昂贵且不必要的。相反,只需获取最大值并将其从数组中删除。 (旁白:如果最大值出现不止一次,你没有说明会发生什么。请参阅下面的代码和最后一句。)
  • 您不需要n=arr.lengthfor i in 1..arr.length就足够了,除了......
  • for ...很少使用。 Rubyist倾向于使用each,或Enumerable(混合)模块中的众多方法之一(所有这些方法都调用each)。
  • 您不需要return false因为Ruby返回最后一个语句的值,如果该方法之前没有返回false,则返回true

这是一种更像Ruby的方式:

def max_match?(arr)
  mx = arr.max
  whats_left = arr - [mx]
  (1..whats_left.size).any? {|n| whats_left.combination(n).any? {|c|
    c.reduce(:+) == mx }}
end

arr = [1,4,7,3,5,2,13]
max_match?(arr) #=> true
arr = [1,3,4,7,59]
max_match?(arr) #=> false

如果您希望当true包含多个等于arr的值时返回mx,请在mx = arr.max之后插入以下内容:

return true if arr.count(mx) > 1