2012-08-24 434 views
4

我需要編寫一個代碼來計算一個數字的總和,這是問題的確切文本:數字n的數字總和是其數字的總和。寫一個遞歸函數digitalSum(n),該函數採用正整數n並返回其數字和。例如,digitalSum(2019)應該返回12,因爲2 + 0 + 1 + 9 = 12。這是我寫的代碼:數字總和,Python

def digitalSum(n): 
    L=[] 
    if n < 10: 
     return n 
    else: 
     S=str(n) 
     for i in S: 
     L.append(int(i)) 
     return sum(L) 

這些代碼工作正常,但它不是一個遞歸函數,而且我不允許任何INT更改爲海峽。你可以幫我嗎?

回答

9

試試這個:

def digitalSum(n): 
    if n < 10 : 
     return n 
    return n % 10 + digitalSum(n // 10) 

編輯:該算法背後的邏輯是,對於遞歸函數的每次調用,我們將數字的最後一位數字斬下並將其加到總和中。首先我們獲得最後一位數字n % 10,然後我們再次調用該函數,並傳遞最後一位被截斷的數字:n // 10。我們只在達到一位數字時停止。在我們停下來之後,隨着遞歸調用的返回,數字的總和將以相反的順序計算。

示例數12345:

5 + digitalSum(1234) 
5 + 4 + digitalSum(123) 
5 + 4 + 3 + digitalSum(12) 
5 + 4 + 3 + 2 + 1 <- done recursing 
5 + 4 + 3 + 3 
5 + 4 + 6 
5 + 10 
15 
+2

發佈的代碼片段,沒有解釋沒有回答功課questio的最佳方式納秒。考慮閱讀http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer-homework-questions – georg

+0

我會盡量在將來更有幫助,雖然有這樣一小段代碼沒什麼好說的。 – Grampa

+0

非常感謝!現在我明白了。 – Reginald

1

一些提示:

  1. 您可以在Python定義的內部函數
  2. 可以使用模運算符(它的語法和用法查找),效果良好,這裏
  3. 有沒有必要建得到適當的遞歸解決方案

編輯一個明確的列表表示以上是有點「壞」作爲一個籠統的回答,如果有些什麼其他人在非家庭作業環境中有這個問題嗎?然後堆棧溢出失敗...

所以,這是我將如何實現它,並需要決定你是否應該繼續閱讀。 :)

def digitalSum(n): 
    def process(n, sum): 
    if n < 10: 
     return sum + n 
    return process(n/10, sum + n % 10) 
    return process(n, 0) 

這可能有點太多了,但即使在學習情況下訪問一個答案也是有益的。

我的解決方案比一些更冗長,但它對tail call optimizing compiler也更友好,我認爲這是一項功能。

+0

我認爲我的解決辦法是更優雅;) –

3

這是作業,所以我不寫很多代碼。遞歸可以通過以下方式使用:

  • 得到第一個(或最後一個)數字
  • 格式,其餘爲短號碼
  • 添加數字和稍短一些的數字總和( !遞歸)
-2
def digitalSum(n): 
    if n < 10: 
     return n 
    else: 
     return ??? 

的第一部分是從現有的代碼。 The ???是你需要制定的部分。它可能會從n取下一位數字,並將其添加到剩餘數字的數字和。

你並不真正需要的else,但我離開那裏,使代碼結構看起來相同

3

這是更相關的算法問題。

這裏是你的答案:

def digit_sum(a): 
    if a == 0: 
     return 0 
    return a % 10 + digit_sum(a/10) 

讓我知道,如果你不明白爲什麼它的作品,我會提供一個解釋。

+0

將它添加到python 3,它工作,但我不明白什麼是digitalSum(a // 10),它似乎是digitalSum(n // 10)!= n // 10,所以wath是digitalSum()? – Reginald

0
def digital_sum(number): 
    if number < 10: 
     return number 
    else: 
     return number % 10 + digital_sum(number/10) 
-1

高清drs_f(P):

drs = sum([int (q) for q in str(p)]) 
while drs >= 10: 
    drs = sum([int(q) for q in str(drs)]) 
return drs 
-1

你仍然可以做到在O(日誌10 N)...抵消所有的數字,增加了到9,如果沒有號碼留下,9答案是別人總結所有的冷落數字...

def rec_sum_Reduce(n) : ans = 0 for i in map(int,str(n)) : ans = 1+(ans+i-1)%9 return ans