在Ruby中放置变量声明(初学者)

时间:2016-09-24 20:28:41

标签: ruby variables syntax declaration

我正在解决一些在线练习问题以学习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

如果有人可以就此提供解释或一些入门级资源,我将不胜感激。感谢。

编辑:

很抱歉有关所需输出的缩进和特殊问题。我对此完全陌生,有时候细节漏掉,我很感激反馈。感谢您逐步进行逻辑运行,这正是我所寻求的。

1 个答案:

答案 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.lengthfalse, 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