2013-08-05 32 views
0

問這樣一個狹窄問題的道歉。我正在嘗試解決Project Euler中的問題5(計算可由1到20中的所有數字均分的最小正數)來學習Ruby。Ruby中的項目Euler#5 - 代碼結果意外

我寫了下面的代碼:

def calc_min_multiple(array) 
    array.each do |value| 
     if div_check(value) == true 
      return value 
      break 
     end 
    end 
end 


def div_check(num) 
    1.upto(20) do |divisor| 
    if num % divisor != 0 
     return false 
    end 
    end 
    return true 
end 

range = *(20..500000) 
puts calc_min_multiple(range) 

奇怪的是,該方案只是把每一個值的範圍數組我定義的,而不需要通過功能裏面所有的邏輯去。我試過調試,但找不到問題。任何幫助深表感謝!

+0

請確認它在你的問題是什麼。這整個事情是一個聲明。如果我們能夠弄清楚您是否正在嘗試爲挑戰尋求解決方案,或者您是否在詢問具體的事情,這會有所幫助。在這種情況下,我選擇了你想知道爲什麼當你給出每個塊時返回數組。 – vgoff

回答

1

問題的答案「爲什麼我的方法返回並返回我給它的數組?是由於文檔所述關於each when you give a block.。該數組被返回。

+0

感謝您的反饋。對於每張地圖,我仍然有點困惑。看起來在兩種情況下,數組中的每個值都依次由代碼評估。 –

+0

這是真的。它們都會迭代。然而,一個返回集合的行爲,另一個收集結果,返回一個新的數組。這個文件很清楚。如map文檔中所述:「創建一個包含塊返回值的新數組。」 – vgoff

+0

你的答案中還有*「很多基本的誤解」*。大部分是無稽之談。使用'map'的建議毫無價值,因爲重點在於找到'div_check'返回'true'的* first *數字,而不是返回一個數字列表。而'div_check'方法本質上是在執行'(1..20).all? {| divisor | num%divisor == 0}':你提出的'check_num'替代方法根本沒有幫助,因爲它只檢查一個除數。 – Borodin

0

有幾個問題calc_min_mulitple方法

  1. div_check(value) == true。雖然它會起作用,但不要像這樣檢查布爾平等。對於trueif !div_check(value)對於false只需做if div_check(value)

  2. array.eachbreak聲明是無法訪問的,因爲你之前它是return false

+0

'if!div_check(value)'* * * * * * * * * * * – Borodin

-1

您遇到的問題是因爲您的代碼沒有嘗試足夠高的數字來滿足標準。 (提示:這是在1E8的方式,這將需要年齡來計算這種方式,這就是爲什麼它是在項目歐拉!)

calc_min_multiple循環結束在數組的結尾,它返回最後一個表達式評估值是each,它評估它正在處理的數組,因此您的puts只是打印全部的數組元素。

因此,您需要calc_min_multiple方法中的特定return來表示沒有找到結果。

另一點。紅寶石range也不是構建一個五十萬個元素的數組,而是也有一個each方法,所以你可以傳遞(unflattened)範圍。

您還可以使用後固定語句修飾if用地在這裏,所以你的方法是這樣的

def calc_min_multiple(range) 
    range.each do |value| 
    return value if div_check(value) 
    end 
    'None' 
end 

def div_check(num) 
    1.upto(20) do |divisor| 
    return false if num % divisor != 0 
    end 
    return true 
end 

puts calc_min_multiple(20..500_000) 

輸出

None 

最後,這樣做的更加Rubyish方式:

def calc_min_multiple(range) 
    range.find { |value| div_check(value) } 
end 

def div_check(num) 
    (1..20).all? { |divisor| num % divisor == 0 } 
end 

puts calc_min_multiple(20..500_000)