2016-09-21 124 views
0

我的一個ruby程序檢測數組中的奇數並將它們相加並不能提供正確的輸出。鑑於我正在學習ruby,這是一個邏輯錯誤,我不能輕易推斷我犯了什麼錯誤。 這裏是代碼:在數組中添加不提供正確輸出的奇數

def odd_sum(numbers) 
    index = 0 
    result = 0 
    while index < numbers.length 
    if (numbers[index] % 2 != 0) 
     result += 1 
    end 
    index +=1 
    return result 
    end 
end 

puts odd_sum([1,2,4,5,7,9]) currently my output is 1 should be 22 
puts odd_sum([0,6,4,4]) currently output 0 
puts odd_sum([1,2,1]) currently output 1 should be 2 

問題:爲什麼我的輸出錯誤?任何方式使這個更清潔或更好? 我正在cloud9上運行一個名爲oddball.rb的程序。

+1

不要介意你的縮進,否則真的很難看到是錯誤的。 – Aetherus

回答

1

看看你的if語句:結果+ = 1,不要加1,但添加了目前正在測試的數量:結果+ =號[指數]

矽統

2

return result會導致代碼在那裏和那裏退出......它只會添加第一個數字,然後永遠退出整個方法......它永遠不會查看數組的其他元素。

現在已經正確縮進你的代碼,你可以看到這行是在while循環中的...... 可能你希望它在while循環之外......當你看到這種bug時更容易正確縮進你的代碼。你應該總是縮進你的代碼......在你遇到像這樣的錯誤之前,它似乎並不重要......它總是很重要。現在開始是一個好習慣。 ;)

1
def odd_sum(numbers) 
    index = 0 
    result = 0 
    while index < numbers.length 
    if (numbers[index] % 2 != 0) 
     result += 1 
    end 
    index +=1 
    return result 
    end 
end 

puts odd_sum([1,2,4,5,7,9]) currently my output is 1 should be 22 
puts odd_sum([0,6,4,4]) currently output 0 
puts odd_sum([1,2,1]) currently output 1 should be 2 

上線result += 1,你添加的每個有奇數,所以它不是一個總和,而是一個計數時間1

在行return result上,程序在遇到return時會立即結束。因此,由於第一個數組中的第一個數字是奇數,程序會將結果遞增1,然後返回結果。

你想要做的是result += numbers[index],並在while循環結束時返回結果。

在Ruby中,通常有更好的方法來做事情,而循環是指當你不知道你循環了多少次。在這種情況下,你確切知道有多少次,所以我會建議使用迭代器。

def odd_sum(numbers) 
    result = 0 
    numbers.each do |num| 
    result += num if num.odd? 
    end 
end 

甚至更​​好

def odd_sum(numbers) 
    numbers.select(&:odd?).reduce(&:+) 
end 
+0

我最初的想法是「甚至更好」並不是更好,因爲它需要兩次通過陣列。但經過反思,我同意你的看法,因爲'select'和'reduce'都是用C編寫的,所以它可能比你的第一種方法更快。將其分解爲兩個連續的操作也使調試和測試變得更加容易。注意你可以寫'.reduce(:+)'。 (請參閱文檔) –