我正在解决一些在线练习问题以学习Ruby,虽然我能够解决这个问题,但我很难理解变量声明的位置。
当我在idx2 while循环中声明/定义“pair”(数组索引的总和)时,为什么以下代码有效,但是在我自己声明索引之后直接执行此操作时呢?
def two_sum(nums)
idx=0
idx2=0
while idx<nums.length-1
idx2=idx+1
while idx2<nums.length
pair=nums[idx]+nums[idx2]
if pair==0
return [idx, idx2]
else
idx2+=1
end
end
idx+=1
end
end
上面的版本有效,但下面的结构没有。
def two_sum(nums)
idx=0
idx2=0
pair=nums[idx]+nums[idx2]
while idx<nums.length-1
idx2=idx+1
while idx2<nums.length
if pair==0
return [idx, idx2]
else
idx2+=1
end
end
idx+=1
end
end
如果有人可以就此提供解释或一些入门级资源,我将不胜感激。感谢。
编辑:
很抱歉有关所需输出的缩进和特殊问题。我对此完全陌生,有时候细节漏掉,我很感激反馈。感谢您逐步进行逻辑运行,这正是我所寻求的。
答案 0 :(得分:1)
让我们一次查看一个工作代码和破坏的代码。
让我们说nums = [1, 2, -1, 3]
可支持的工作代码
1 def two_sum(nums)
2 idx = 0
3 idx2 = 0
4
5 while idx < nums.length-1
6 idx2 = idx+1
7 while idx2 < nums.length
8 pair = nums[idx] + nums[idx2]
9 if pair == 0
10 return [idx, idx2]
11 else
12 idx2 += 1
13 end
14 end
15 idx += 1
16 end
17 end
当我们开始时
idx = 0, idx2 = 0
现在我们处于第一个while循环(第6行)
idx = 0, idx2 = 1
第二次循环(第8行)
idx = 0, idx2 = 1, pair = nums[0] + nums[1] = 3
pair != 0
,因此我们现在处于else
声明中。 (第12行)
idx = 0, idx2 = 2, pair is still 3
我们现在循环回到第二个while循环(第8行)
idx = 0, idx2 = 2, pair = nums[0] + nums[2] = 0
pair == 0
,所以我们返回[0, 2]
(第10行)
这就是代码运行的方式。
破码
1 def two_sum(nums)
2 idx = 0
3 idx2 = 0
4 pair = nums[idx] + nums[idx2]
5 while idx < nums.length-1
6 idx2 = idx+1
7 while idx2 < nums.length
8
9 if pair == 0
10 return [idx, idx2]
11 else
12 idx2 += 1
13 end
14 end
15 idx += 1
16 end
17 end
我们将再次运行相同的逻辑。
在我们点击第一个while循环之前(第2 - 4行)
idx = 0, idx2 = 0, pair = nums[0] + nums[0] = 2
现在我们处于第一个while循环中,(第6行)
idx = 0, idx2 = 1, pair = 2
现在是第二次循环pair != 0
,所以我们点击了else
语句,(第12行)
idx = 0, idx2 = 2, pair = 2
现在我们循环回第二个while循环的开头。 pair != 2
,所以我们点击else
语句。
idx = 0, idx2 = 3, pair = 2
pair != 0
,所以我们点击else
语句。
idx = 0, idx2 = 4, pair = 2
现在,idx2 < nums.length
是false, so we exit the second while loop, and now
idx = 1`,我们继续循环。
正如您所看到的,因为您在while循环之外声明了pair
,所以它永远不会重新计算到不同的值,因此您永远不会点击if
语句,因为pair
永远不会等于零,除非您在初始总和上获得0
。
while
循环适用于您不确定需要多少循环的情况。一个示例是检查用户的条目,您可能需要循环一次或十次,具体取决于用户何时获得正确的条目。在这种情况下,您确切地知道需要运行多少次。所以,迭代器对于这里的工作更好。
这是一个如何编写的例子。请记住,可能有更好的方法来做到这一点,我只想展示一个例子。
def two_sum(nums)
nums.each_with_index do |num1, idx1|
nums.each_with_index do |num2, idx2|
next if idx1 == idx2
return [idx1, idx2] if num1 + num2 == 0
end
end
end