2014-11-09 49 views
-1

我有一個解決方案,但不是我想要的。下面的代碼:程序凍結:添加數組元素

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來中斷它。

我確定我只是不理解這裏發生了什麼,所以我尋求幫助。

我也意識到我可以使用injecteach循環爲一個更簡單的總和解決方案(和地圖和procs /塊和其他對象)。我想了解這些工作是如何工作的,而不僅僅是想出一個解決方案。

+0

它有助於說出你的程序是要完成什麼,並給出你想要的輸入和相應輸出的例子...... – 2014-11-09 04:02:23

回答

1
idx3 < nums.length 

由於您沒有更改這兩個值,所以右側將保持比左側更大,並且循環永不結束。

使用其他條件代替,將導致某些我不能預測不知道num是什麼,但可能不是你所期望的,因爲你覆蓋了存儲在result上的值,所以只有最後一次迭代將會使一些明顯的東西。

沒有數組總和我可以在這裏看到:S

我建議你儘量簡單的程序和測試一個概念,在同一時間。如果你一次測試所有的人,你就不會知道是什麼造成了什麼。

+0

如上所述,當idx2遞增時,idx3應該增加。情況並非如此嗎? – Proto 2014-11-09 01:53:15

+1

@ Proto不,事實並非如此。當你說你想讓idx2等於idx3 + 1時,你只需複製值idx3 + 1並將其存儲到idx2中。之後,每個變量遵循它自己的路徑,以及它們之間的關係。 – SlySherZ 2014-11-09 12:16:07

0

在你的第二個while循環中,你不增加idx3。因此,idx3永遠不會達到num.length,並且你有一個無限循環。

+0

這不應該是真的。每次傳遞idx2都會增加,這會自動增加idx3。或者至少這是我認爲會發生的事情。情況並非如此嗎? – Proto 2014-11-09 01:52:10

+0

您需要將'idx3 = idx2 + 1'移到'while'循環中(在'result = ...之前,但不需要'idx3':'result =(nums [idx2] .to_i) +(nums [idx2 + 1] .to_i)'。我還沒有經歷剩下的代碼,所以我不知道這個改變是否足夠。 – 2014-11-09 02:07:59