3

我有下面的代码。方法sum_to_n?接受一个arr整数数组和一个整数n作为参数,true如果有任何两个元素arr相加,则返回n。它应该以零返回true为空,但不断返回。arrnfalse

def sum_to_n?(arr, n)
  hash = Hash.new(0)
  arr.each do |val|
    if hash.key? val
      return true
    else
      hash[n-val] = val
    end
  end
  return false
end

我究竟做错了什么?

4

2 回答 2

7

较短的版本:

def sum_to_n?(arr, n)
  (arr.empty? && n.zero?) || arr.permutation(2).any? { |a, b| a + b == n }
end
于 2013-10-13T23:52:47.663 回答
2

您的代码(几乎)是正确的,但您的期望是错误的。true当有两个(或一个)元素加起来为n. 如果您传递一个空数组,则不会有任何元素相加n(因为首先数组中没有元素)。因此,你得到false.

如果您希望它返回true一个空数组,那么这将是一种不符合逻辑的异常行为。您将不得不提出一个条件,例如

return true if arr.empty?

在你的代码中。

于 2013-10-13T23:17:20.333 回答