我昨天剛開始使用 Ruby。我在網上看到了一些基礎知識,并開始做一些初學者編碼挑戰,其中一個要求找到素數。我嘗試不使用 Ruby 中已有的主要功能。我想我幾乎擁有它,但我不明白為什么錯誤會出現。
“18:in ': nil:NilClass (NoMethodError) 的未定義方法 %'”
我現在嘗試調整它幾個小時,似乎無法在網上找到解決方案......我使用 Ruby 3.0.0,這是我到現在為止設法構建的代碼:
nums = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
prime_nums = []
i = 0
#Loop on the array to check each element
while i <= nums.length
check = 0
divider = nums[i]
#While to prevent DivisionByZero error
while divider != 0
if nums[i] % divider == 0 #/!\ ERROR HERE
check = 1
end
divider -= 1
end
#Only division by 1 and itself will increment $check
if check == 2
prime_nums.append(nums[i])
end
i = 1
end
puts prime_nums
uj5u.com熱心網友回復:
在您的示例中,這意味著nums[i]回傳 nil,因此情況i是大于 19。
您可以更改while i <= nums.length為,while i < nums.length因為陣列在 Ruby 中從 0 開始索引。
uj5u.com熱心網友回復:
undefined method %' for nil:NilClass表示您正在嘗試使用%on nil。nil例如,當您嘗試從陣列中獲取太多資訊時,您會得到什么。
如果我們放入p "#{i}: #{nums[i]}"回圈中,我們會看到i20. 陣列從 0 開始計數,因此如果陣列中有 20 個元素,則最高索引為 19. num[20]is nil。
您可以通過while i < nums.length在 19 處停止來解決此問題。
然而,很少有人while用 Ruby撰寫回圈。相反,您使用方法進行迭代。each遍歷陣列的每個元素。你可以用 倒計時downto。
nums.each do |num|
check = 0
num.downto(1) do |divider|
if num % divider == 0
check = 1
end
end
#Only division by 1 and itself will increment $check
if check == 2
prime_nums.append(num)
end
end
現在沒有機會被淘汰。
uj5u.com熱心網友回復:
@Schwern 的回答對在 Ruby 中使用迭代方法有很好的建議。我們可以使用它們來使您的演算法更加高效。
def is_prime?(num)
2.upto Math::sqrt(num) do |divisor|
return false if num % divisor == 0
end
true
end
與其從numto向下迭代1并跟蹤除數,我們可以從2的平方根開始并向上作業num。如果我們找到一個偶數除數,我們知道它不是素數并且可以立即回傳false,從而節省了我們進一步迭代任何東西的作業量。
如果我們到達回圈的末尾,我們知道num必須是素數并回傳true。
然后假設我們要列印從1to 的素數500,我們可以這樣做:
1.upto 500 do |num|
puts num if is_prime? num
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/407150.html
標籤:
