2014-07-18 42 views
2

所以我一直在試圖創建一個方法來顯示任何整數的素數的數組,作爲參數插入,但我一直在最奇怪的錯誤。任何人都可以解釋這個錯誤意味着什麼,以及如何使用任何寶石解決我的問題W/O?我試着看堆棧溢出,並沒有找到解決方案。謝謝!Ruby:當我使用遞歸來查找素數時出現錯誤

def prime_factors(num, output = []) 
    factor = (2..num-1).find(0){|divisor| num % divisor == 0} #returns nil if find fails. 
    output << factor if factor != 0 
    prime_factors(num/factor, output) 
end 

prime_factors(5) 

我已經收到的錯誤是:

`find': undefined method `call' for 0:Fixnum (NoMethodError) 
in `prime_factors' 
in `<main>' 

回答

0

Enumerable#find的文檔(你在你的函數的第一行稱:http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-find

find參數是如果Enumerable(在你的情況下是(2..num-1))沒有對象匹配(即給定的塊總是返回false),所以find嘗試找到一個號碼,其中num % divisor等於0,但沒有找到。然後,它調用作爲參數提供的函數。您爲該參數傳遞0。所以它試圖調用0作爲函數(這是通過執行call方法:0.call來完成的)。但類Fixnum0沒有這樣的方法(它不是一個函數,而是一個數字)。這會生成錯誤消息。

+0

我看到...謝謝!我認爲'find'返回了'ifnone',爲其阻塞失敗,但通過ruby文檔回顧我發現ifnone是一個方法調用。感謝幫助! – Matt16749

+0

我認爲最優雅的解決方案是在這種情況下給'find'沒有參數,所以它返回'nil'並將'factor'設置爲'0':factor =(2..num-1).find { |除數| num%divisor == 0} or 0' –

+0

我同意給沒有參數將是一個優雅的解決方案,如果它的工作,但我遇到的問題是,我不能脅迫nil評估下一行輸出<< factor if factor!= nil'我得到以下錯誤:'nil不能被強制轉換成Fixnum(TypeError)' – Matt16749

0

你所得到的錯誤是因爲在以下線

factor = (2..num-1).find(0) 

因爲find方法是無法觸發喊出了「0即Fixnum對象」作爲參數查找(0)。 我不知道你爲什麼這樣做。

相反,你可以試試這個邏輯

(2..num-1).each do |i| 
    is_prime = true 
    (2..Math.sqrt(i)).each { |j| is_prime = false if i % j == 0 } 
    output << i if is_prime 
end 
+0

感謝您的幫助!當我走過邏輯時,我一定會嘗試你的解決方案。 – Matt16749

相關問題