2014-11-09 3 views
-1

У меня есть решение, но не единственное, что я хочу. Вот код:Программа Freeze: добавление элементов массива

def sum(nums) 
idx = 0 

while idx < nums.length 
    nums[idx] = idx * nums[idx] 

    idx += 1 
end 

print nums 

idx2 = 0 
idx3 = idx2 + 1 
while idx3 < nums.length 
    result = (nums[idx2].to_i) + (nums[idx3].to_i) 

    idx2 += 1 
end 

puts result 
end 

sum([2,3]) 
sum([2,3,5]) 
sum([2,3,5,2]) 

Две вещи, которые я не понимаю, происходят на втором while цикле. Во-первых, если я использую while idx2 < nums.length, я получаю необычное дополнение (суммы массивов возвращаются как 6, 13, 9). Если я использую while idx3 < nums.length, программа не будет работать полностью. Он останавливается на линии 14 (во втором цикле), где я должен перевести его на Ctrl+C.

Я уверен, что я просто не понимаю, что здесь происходит, поэтому я прошу о помощи.

Я также понимаю, что я могу использовать inject и each петли для более простого решения суммы (и карта и проки/блоки и другие объекты). Я пытаюсь понять, как это работает, а не просто придумать решение.

+0

Это помогает сказать, что ваша программа предназначена для выполнения, и дать примеры входов и соответствующих выходов, которые вы хотите ... –

ответ

1
idx3 < nums.length 

Будет всегда верно, потому что вы не меняется ни одно из этих значений, так что право будет оставаться больше, чем левая, и ваш цикл никогда не заканчивается.

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

Там нет массива суммы можно увидеть здесь: S

Я предлагаю вам попробовать просто программа и тест одна концепция в то время. Если вы проверите их все сразу, вы не будете знать, что вызывает что-то.

+0

Как упоминалось выше, idx3 должен увеличиваться при увеличении idx2. Разве это не так? – Proto

+1

@Proto Нет, это не тот случай. Когда вы говорите, что хотите, чтобы idx2 был равен idx3 + 1, вы копируете только значение idx3 + 1 и сохраняете его в idx2. После этого каждая переменная следует своему собственному пути, к отношению между ними. – SlySherZ

0

Во втором цикле while вы не увеличиваете idx3. Таким образом, idx3 никогда не достигает num.length, и у вас есть бесконечный цикл.

+0

Это не должно быть правдой. idx2 увеличивается на каждый проход, который автоматически увеличивает idx3. Или, по крайней мере, это то, что, как я думал, произойдет. Разве это не так? – Proto

+0

Вам нужно переместить 'idx3 = idx2 + 1' в цикл' while' (прямо перед 'result = ...', но вам не нужно 'idx3':' result = (nums [idx2] .to_i) + (nums [idx2 + 1] .to_i) '. Я не просмотрел остальную часть вашего кода, поэтому я не знаю, достаточно ли этого изменения. –

Смежные вопросы