无论如何都要迭代不同的数组组合吗?
我编写的程序如果数组中的最大数字可以是数组中任何成员的总和,则返回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。所以我猜测它与组合方法无法循环有关。有什么建议吗?
答案 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.length
。 for 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