2012-09-10 61 views
0

我創建了以下工作,但它看起來很神祕。有沒有辦法以更多的Ruby風格或可以理解的方式來編寫它?如何重構此Ruby代碼?

該方法將數字下面的較低因子刪除。所以,10.high_factors返回[6,7,8,9,10]。 6可以被2整除,所以2被移除。列表中沒有大於6的倍數,因此它保持不變。

​​

的Ruby 1.9.3

+3

我不明白這個......爲什麼不只是返回[self/2 + 1 .. self] – halfelf

回答

5

您的方法的結果將始終是從(N/2) + 1N之間的數字列表。

對於每個i<=(N/2),2*i也將在列表中。

對於列表中的每個j >= (N/2)+1,其上不會有k=x*j其上x是一個大於1的整數,因爲2*j > N

因此,如果您的方法只返回((self/2 + 1)..self).to_a它也會按照您的意願工作。

+1

儘管這並沒有重構任何Ruby代碼,它確實是最好的答案,因爲它使用數學來證明正確性。 –

2

這個怎麼樣?只要刪除可以被大寫整除的數字。

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_',因爲我們可以添加?

+0

有趣......它有點容易理解...... –

1

繼承人礦

def high_factors 
    ary = (2..self).to_a 
    ary.reject do |factor| 
    ary.index {|num| num != factor and num % factor == 0} 
    end 
end 

它的工作原理的原因陣列#指標返回nil,如果它不能找到合適的匹配。