2015-09-30 44 views
-3

函數的遞歸調用(或歸納步驟)是什麼,該函數返回的整數數量從1到N,它們均勻分割N.這個想法是將一個純遞歸代碼python這個函數。沒有'for'或'while'循環,兩個模塊都不能使用。功能num_of_divisors(42)返回圖8,表示​​1,2,3,6,7,14,21,和42的42Python純遞歸 - 除數 - 一個輸入

+0

你嘗試過什麼了嗎? –

+0

沒有模塊?真? – Dleep

+0

限制的要點是什麼?這是一個好奇心還是一個學術任務? –

回答

1
def num_of_divisors(n): 
    return sum(1 if n % i==0 else 0 for i in range(((n+1)**0.5)//1) 

好運它解釋給教師除數!

如果你真的不能使用for環(?????????),那麼這是不可能的,沒有模擬。

def stupid_num_of_divisors_assigned_by_shortsighted_teacher(n, loop_num=1): 
    """I had to copy this from Stack Overflow because it's such an 
    inane restriction it's actually harmful to learning the language 
    """ 

    if loop_num <= (n+1) ** 0.5: 
     if n % loop_num == 0: 
      return 2 + \ 
       stupid_num_of_divisors_assigned_by_shortsighted_teacher(n, loop_num+1) 
     else: 
      return stupid_num_of_divisors_assigned_by_shortsighted_teacher(n, loop_num+1) 
    else: 
     if n % loop_num == 0: 
      return 1 

加分點:解釋爲什麼你要添加的第一個條件2,但僅在第二條件1

+0

優秀的答案;-) – sascha

+1

除了它使用循環...所以它違反了術語:)但是是 –

+0

@JoranBeasley我其實錯過了。這是荒謬的。無論如何,更新,以便它符合任務的精神。 –

0
def n_divisors(n,t=1): 
    return (not n%t)+(n_divisors(n,t+1) if t < n else 0) 

上試運氣好後...好打這些書真的,去上課,做筆記...

只需輸入我猜

t=0 
def n_divisors(n): 
    global t 
    t += 1 
    return (not n%t)+(n_divisors(n) if t < n else 0) 
+1

哦,你可以做得比這更好!檢查(n + 1)/ 2中的所有t是否足夠 –

+0

哦,我知道......但是我原本是這麼做的......但是後來我覺得如果他把它放在自己身上,我會留下至少一些改進的東西(加上我沒有必要做一個特殊的情況下添加自己的數字:P) –

+0

是的,即使你知道這是別人的任務,你也很難忍住自己。當我寫我的解決方案時,對我來說很難:-) – cg909

1

這裏你去哥們,你的老師會很開心。

def _num_of_divisors(n, k): 
    if (k == 0): 
     return 0 
    return _num_of_divisors(n, k-1) + (n % k == 0) 


def num_of_divisors(n): 
    return _num_of_divisors(n, n) 
+0

哈哈,偉大的思想思維相反:P + 1 –

+0

兩個輸入。 (n,k)。唯一的輸入是N - 或(n)。這條指令簡單地實現了等分和,準確地說明了公式如何:num_of_divisor(12)= 1^0 + 2^0 + 3^0 + 4^0 + 6^0 + 12^0,這轉換爲:= 1 + 1 + 1 + 1 + 1 + 1 = 6.謝謝! – HandyFrank

0

它比您想象的那樣容易將一個簡單的問題從循環轉換爲遞歸函數。

開始用循環實現:

n = 42 
result = [] 
for i in range(n+1): 
    if n % i == 0: 
    result.append(i) 

然後寫一個函數

def num_of_divisors_helper(i, n, result): 
    if <condition when a number should be added to result>: 
     result.append(n) 
    # Termination condition 
    if <when should it stop>: 
     return 
    # Recursion 
    num_of_divisors_helper(i+1, n, result) 

然後定義一個包裝函數num_of_divisors調用num_of_divisors_helper。您應該能夠填充遞歸函數中的空白並自己編寫包裝器函數。

這是一個簡單,低效的解決方案,但它符合您的條款。

+0

並非一切都是關於效率。 「自然是一位修理工而不是發明家」遞歸的純粹形式不僅是計算機科學的基礎,它也是每一個進化步驟的一部分。數學只是我們可以與自然交流的語言,我提議將這個假設實現爲一段代碼:函數(N)= 1^0 + 2^0 + 3^0 + 4^0 + 6^0 + 12^0 =>我如何添加expoents?他們不必將它們作爲一個整數排除在遞歸步驟之外,它們必須能夠添加平方根,所以= 1 + 1 + 1 + 1 + 1 + 1 = 6 – HandyFrank

+0

@HandyFrank我主要寫道,提示優化是低效的像在(n + 1)/ 2停止是可能的,不用說太多。 – cg909

0

不使用%

def is_divisible(n, i, k): 
    if k > n: 
     return False 
    if n - i*k == 0: 
     return True 
    else: 
     return is_divisible(n, i, k+1) 

def num_of_divisors(n, i=1): 
    if i > n/2: 
     return 1 
    if is_divisible(n, i, 1): 
     return 1 + num_of_divisors(n, i+1) 
    else: 
     return num_of_divisors(n, i+1) 

num_of_divisors(42) - > 8

+0

我也試過這個!我被拒絕拒絕!不,我= 1。只有一個輸入(N) - 或(n)。定義兩個函數表示模塊:拒絕 - 我也嘗試過這一個!毫無疑問!偉大的代碼,我可以做到這一點,就像它!然而,這是我對計算機科學理論研究的一部分,與分析數論有關。不尋求有效的代碼。這條指令簡單地實現了等分和,準確地說明了公式如何:num_of_divisor(12)= 1^0 + 2^0 + 3^0 + 4^0 + 6^0 + 12^0,這轉換爲:= 1 + 1 + 1 + 1 + 1 + 1 = 6。 – HandyFrank