带循环的ruby函数返回错误的值

时间:2017-05-02 07:22:43

标签: ruby

我有关于代码的问题

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],尽管它不应该。

为什么会这样?

2 个答案:

答案 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}