在Ruby中,我想取一组数字,选择2个不同的数字,将这2个数字加在一起,看看那里的天气等于变量x的变量x.这是我使用的代码
def arrayIsEqual? (numArray, x)
return true if numArray.sample + numArray.sample == x
return false if numArray.empty? || numArray.count == 1
end
Run Code Online (Sandbox Code Playgroud)
例如
numArray = [4,2,7,5]
x = 11
Run Code Online (Sandbox Code Playgroud)
arrayIsEqual (numArray, n)
应该返回true
,因为4 + 7 = n(11)
我如何让它工作?
我不希望它是2个随机数,只是任意2个不同的数字加起来n
Joh*_*lla 12
看起来您正在尝试查看数组中是否有任何两个数字加起来指定的值x
.但是,您的代码只是随机选择两个数字并检查这些数字是否相加.
Ruby有这个Array#combination
方法,它生成给定长度的所有组合:
def contains_pair_for_sum?(arr, n)
!!arr.uniq.combination(2).detect { |a, b| a + b == n }
end
Run Code Online (Sandbox Code Playgroud)
有几点需要注意:
首先,我们根据Ruby约定命名它:每个单词都是separated_by_underscores
.所述?
在端部是指,该方法是谓词方法,并返回真或假值.
在方法内部,会发生一些事情.让我们一块一块地看一下这条线.
arr
:我们采用传入的数组.
<...>.uniq
:我们只关注独特元素(因为OP想要选择两个不同的数字).
<...>.combination(2)
:我们要求长度为2的数组的所有组合.如果数组是[4, 5, 6]
,我们得到[[4, 5], [4, 6], [5, 6]]
.
<...>.detect { |a, b| a + b == n }
:我们寻找第一个加起来的组合n
.如果我们找到一个,那就是该方法的结果.否则,我们得到nil
.
!!<...>
:最后,我们取得了我们得到的结果detect
并将其否定了两次.第一个否定产生一个布尔值(true
如果我们得到的值是nil
,或者false
如果它是其他任何东西); 第二个否定产生一个布尔值,该值与第一个否定的真值相同.这是一个Ruby成语,可以将结果强制为true
或者false
.
让我们看看它的实际效果:
array = [4, 5, 9, 7, 8]
contains_pair_for_sum?(array, 11)
# => true (because [4, 7] sums to 11)
contains_pair_for_sum?(array, 17)
# => true (because [9, 8] sums to 17)
contains_pair_for_sum?(array, 100)
# => false (no pair matched)
Run Code Online (Sandbox Code Playgroud)