2016-09-24 2 views
1

Я изучаю некоторые проблемы онлайн-практики, чтобы изучить Ruby, и пока я был в состоянии решить эту проблему, я изо всех сил пытаюсь понять что-то о размещении объявления переменной.Размещение объявления переменной в Ruby (новичок)

Почему следующий код работает, когда я объявляю/определяю «пару» (сумму индексов массива) внутри цикла while while, но не тогда, когда я делаю это непосредственно после объявления самих индексов?

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 

Если кто-нибудь может предоставить объяснение или некоторые ресурсы начального уровня об этом, я был бы очень признателен. Благодарю.

Edit:

Извините за вопросы отступов и специфичность в отношении желаемых результатов. Я совершенно новичок в этом, и иногда детали проскальзывают, я ценю отзывы. Спасибо за поэтапное логическое прохождение, именно это я и искал.

+2

Что вы подразумеваете под 'work'? Каковы ваши ожидаемые значения ввода/вывода? – fylooi

+0

отредактировал ваш код, чтобы исправить отступы. во втором примере переменная 'pair' будет иметь одно и то же значение на каждой итерации' while'. В первом случае он может измениться, так как «idx2» может быть увеличен. Хорошее имя пользователя btw :) –

ответ

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 

Сейчас мы находимся в первой во время цикла (строка 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 

теперь зациклить 2 во время цикла (строка 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 

Мы будем работать через ту же логику снова.

Прежде чем мы попали в первую, а петля (строка 2 - 4)

idx = 0, idx2 = 0, pair = nums[0] + nums[0] = 2 

Сейчас мы находимся в первой во время цикла, (строка 6)

idx = 0, idx2 = 1, pair = 2 

А теперь во втором в то время как петли , pair != 0, так что мы попали в else заявление, (строка 12)

idx = 0, idx2 = 2, pair = 2 

Теперь мы зациклить ст искусство второго цикла. 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 ', и мы продолжаем цикл.

Как вы можете видеть, потому что вы объявили 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 
Смежные вопросы