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

Ruby 使用.any方法迭代数组组合方法,ruby,combinations,enumerable,any,Ruby,Combinations,Enumerable,Any,是否存在迭代不同数组组合的方法 我正在编写一个程序,如果数组中的最大数可以是数组中任意成员的和,则返回true 这是我的代码:(原谅我,我在两周前第一次学会了编程) 我对它进行了测试 a=[1,2,3,4] 它返回false,尽管很明显,3+1=4。 当我将上述代码从arr.composition(I)更改为arr.composition(2)时,其返回true。所以我猜这与组合方法不能循环有关。有什么建议吗?您的返回false的位置不正确。实际上,false返回的是没有一个元素(即排序后移除的

是否存在迭代不同数组组合的方法

我正在编写一个程序,如果数组中的最大数可以是数组中任意成员的和,则返回true

这是我的代码:(原谅我,我在两周前第一次学会了编程)

我对它进行了测试 a=[1,2,3,4] 它返回false,尽管很明显,3+1=4。
当我将上述代码从arr.composition(I)更改为arr.composition(2)时,其返回true。所以我猜这与组合方法不能循环有关。有什么建议吗?

您的
返回false
的位置不正确。实际上,
false
返回的是没有一个元素(即排序后移除的元素之外的一个元素)的组合求和(即等于)
最大值
。相反,只有在没有任何大小的组合和
最大值
相加时,才希望返回
false
。这就是您需要的:

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
请注意:

  • 小写字母和可选下划线用于方法名称。您还可以在末尾添加问题(
    )或解释(
    )标记。在这里,一个问号似乎是合适的
  • 不需要将
    发送到a
    。可枚举方法(例如,
    any?
    )可以将枚举数用作接收器
  • 分拣既昂贵又不必要。相反,只需获取最大值并将其从数组中删除即可。(旁白:您没有说明如果最大值出现多次会发生什么。请参阅下面的代码和最后一句。)
  • 您不需要
    n=arr.length
    <代码>对于1中的i..arr.length就足够了,除了
  • for…
    很少使用。Ruby开发者倾向于使用
    each
    ,或者(mix-in)模块中的许多方法之一(所有这些方法都调用
    each
  • 您不需要
    returnfalse
    ,因为Ruby会返回最后一条经过计算的语句的值,如果该方法之前没有返回
    true
    ,则返回值为
    false
下面是一种更类似于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
如果希望在
arr
包含多个等于
mx
的值时返回
true
,请在
mx=arr.max
后插入以下内容:

return true if arr.count(mx) > 1

我的问题是,为什么你们可以通过任何一个循环迭代组合,但我不能用for循环来实现?在我上面的代码中。感谢您的回复,这非常有帮助。
arr-[mx]
删除了所有出现的
mx
感谢您指出这一点,@Stefan。OP的代码只删除了一个元素,但我不确定这是否是目的。我在第三个要点中提到了这个问题,但将通过编辑加以澄清。
return true if arr.count(mx) > 1