我創建了以下工作,但它看起來很神祕。有沒有辦法以更多的Ruby風格或可以理解的方式來編寫它?如何重構此Ruby代碼?
該方法將數字下面的較低因子刪除。所以,10.high_factors
返回[6,7,8,9,10]
。 6可以被2整除,所以2被移除。列表中沒有大於6的倍數,因此它保持不變。
的Ruby 1.9.3
我創建了以下工作,但它看起來很神祕。有沒有辦法以更多的Ruby風格或可以理解的方式來編寫它?如何重構此Ruby代碼?
該方法將數字下面的較低因子刪除。所以,10.high_factors
返回[6,7,8,9,10]
。 6可以被2整除,所以2被移除。列表中沒有大於6的倍數,因此它保持不變。
的Ruby 1.9.3
您的方法的結果將始終是從(N/2) + 1
到N
之間的數字列表。
對於每個i<=(N/2)
,2*i
也將在列表中。
對於列表中的每個j >= (N/2)+1
,其上不會有k=x*j
其上x是一個大於1的整數,因爲2*j > N
。
因此,如果您的方法只返回((self/2 + 1)..self).to_a
它也會按照您的意願工作。
儘管這並沒有重構任何Ruby代碼,它確實是最好的答案,因爲它使用數學來證明正確性。 –
這個怎麼樣?只要刪除可以被大寫整除的數字。
class Fixnum
def high_factors
# Get the numbers that are not divisible by lower ones below self
(2..self).reject do |i|
(i+1..self).any? { |j| j.divisible_by?(i) }
end
end
def divisible_by?(divisor)
self % divisor == 0
end
end
ps:在ruby中,通常在布爾函數的開頭省略'is_',因爲我們可以添加?
有趣......它有點容易理解...... –
繼承人礦
def high_factors
ary = (2..self).to_a
ary.reject do |factor|
ary.index {|num| num != factor and num % factor == 0}
end
end
它的工作原理的原因陣列#指標返回nil,如果它不能找到合適的匹配。
我不明白這個......爲什麼不只是返回[self/2 + 1 .. self] – halfelf