0

我正在尝试检查数组中的任何两个整数的总和是否等于 n。但是,我对第一种情况是错误的,尽管我认为我应该是正确的。

def sum_to_n?(array, n)
  for i in array
    s = n - i
    return true if array.include? s
    return false if i != n - i
  end
end

puts sum_to_n?([1,2,3,4,5], 9)
puts sum_to_n?([1,2,3,4,5], 12)
4

5 回答 5

3

你可以用不多的几行来做到这一点:-)

ary = [1,2,3,4,5]
n=9
ary.combination(2).detect { |a, b| a + b == n }
于 2013-10-06T20:11:01.237 回答
0

我有更多的运气.combination.any?

return array.combination(2).any? {|a, b| a + b == n}

如果任何东西加在一起,这将返回 true,否则返回 false。不过,您将需要更多处理空数组。

于 2013-10-08T18:09:39.743 回答
0

这怎么样 ?

def sum_to_n?(array, n)
  for i in array
    s = n - i
    return true if array.include?(s)
  end
  false # This will be retuned only when no two numbers are found,whose sum is n
end

puts sum_to_n?([1,2,3,4,5], 9)
puts sum_to_n?([1,2,3,4,5], 12)
# >> true
# >> false

简单的代码正在使用Enumerable#find

def sum_to_n?(array, n)
  !!array.find{|e| array.include?(n-e)}
end

puts sum_to_n?([1,2,3,4,5], 9)
puts sum_to_n?([1,2,3,4,5], 12)
# >> true
# >> false

更新(根据@Łukasz Niemier)

def sum_to_n?(array, n)
  array.any? { |num| array.include?(n - num) }
end

puts sum_to_n?([1,2,3,4,5], 9)
puts sum_to_n?([1,2,3,4,5], 12)
# >> true
# >> false

但我会选择Enumerable#find,因为它会停止迭代,一旦它找到项目,情况并非如此Enumerable#any?

于 2013-10-06T20:14:42.680 回答
0
s = n - i # => 8, 11

s那不是你想的那样。

在第一种情况下,您得到错误,因为您认为 8 或 11 包含在您给出的元素从 1 到 5 的数组中。当您给出诸如 6 或 3 之类的东西时,这很有效

于 2013-10-06T20:10:16.493 回答
0

它总是返回false,因为你false在第一个循环中就返回了。正确的是:

def sum_to_n?(array, n)
  for number in array
    return true if array.include?(n - number)
  end

  false
end

如果循环结束而没有找到匹配项,则显式返回 false。

于 2013-10-06T20:12:10.793 回答