2017-04-08 92 views
0

我正在做一個ruby問題,想要一個方法來查找除自身以外的所有數字的除數,輸出是一個有序數組。如果數字是素數,請列出它是素數。紅寶石 - 是否有遞歸解決方案來查找數字的除數?

我目前正試圖教自己遞歸。簡單的遞歸問題,如找到一個數的階乘是非常基本的理解,但我想知道這個問題是否可以遞歸地完成。它似乎符合一個可能但我無法弄清楚的標準。

例子n = 15,除了它本身的除數是[3,5]。

我的代碼解決了這個問題。

require 'prime' 

def divisors(n) 
    return "#{n} is prime" if Prime.prime?(n) 
    x = n/2 
    arr = [] 
    until x == 1 
    arr << x if n % x == 0 
    x -= 1 
    end 
    arr.sort 
end 

任何幫助做這個遞歸將是巨大的,或只是讓我知道這是不是可以做這樣會有幫助過的一個問題。

回答

1
def divisors(n, x=nil) 
    return "#{n} is prime" if Prime.prime?(n) 
    x ||= n/2 
    arr = [] 
    return arr if x == 1 
    if n % x == 0 
    arr << x 
    end 
    (arr.concat divisors(n, x - 1)).sort 
end 

該函數的重構處理三兩件事:

  • 初始呼叫(x ||= /2
  • 基例(早期退貨)
  • 迭代邏輯通過遞歸方法來實現。

一個重要的事情是,其中所述迭代(x)期間改變該變量被置於作爲用於該方法的參數(具有默認值,因此它可以基本上被用作私有參數)

順便說一句,我個人發現學習Elixir對理解遞歸很有幫助。通過模式匹配和多個功能子句,初始調用,基本情況和迭代可以拆分爲自己的方法。

+0

我想你錯過了在你指定的列表中指定變量'n'。 **初始調用'(x || = n/2)'**。 –

+0

N作爲參數傳遞給函數 –

+0

您錯過了代碼解釋中的n,而不是代碼中。 –