我有关于代码的问题
While(true){/*do something*/}
此代码应返回@nums = [3, 2, 4]
@target = 6
def two_sum(nums, target)
random1 = nums.sample
random2 = nums.sample
ary1 = [nums.index(random1), nums.index(random2)].sort
if random1 + random2 == target
return ary1
else
return 1
end
end
loop do
if two_sum(@nums, @target) != 1
print two_sum(@nums, @target)
break
end
puts 2
end
中总和为[3, 2, 4]
的两个元素的索引,即6
或[1, 2]
。但偶尔会出现[0, 0]
,尽管它不应该。
为什么会这样?
答案 0 :(得分:4)
在这部分代码中:
if two_sum(@nums, @target) != 1
print two_sum(@nums, @target)
您正在对two_sum
函数进行两次单独的调用,一次在if
,然后再次在print
。因此,如果第一个结果不等于1,您将进行第二次调用(可能返回1)并打印第二次调用的结果。
相反,您可以捕获对two_sum
的单个调用的结果并打印出来,例如
loop do
result = two_sum(@nums, @target)
if result != 1
print result
...
如果您愿意,可以将作业和比较结合起来:
if (result = two_sum(@nums, @target)) != 1
...
答案 1 :(得分:1)
您的方法的返回值取决于对sample
的调用,即每次返回一个随机的 - 因此可能是不同的 - 元素。然而,方法名称two_sum
并未表明其不纯的性质。如果该方法被称为random_two_sum
,则该错误将更加明显:
if random_two_sum(@nums, @target) != 1
print random_two_sum(@nums, @target)
break
end
因此,除非您想要随机性,否则更好的方法是使用Enumerator
一个接一个地生成值:
def each_two_sum_index(nums, target)
return enum_for(__method__, nums, target) unless block_given?
nums.each_index.to_a.repeated_combination(2) do |i, j|
yield i, j if nums[i] + nums[j] == target
end
end
然后,您可以使用块调用该方法,而不是使用显式loop
:
each_two_sum_index([3, 2, 4], 6) do |i, j|
p i: i, j: j
end
输出:
{:i=>0, :j=>0}
{:i=>1, :j=>2}