2016-11-26 107 views
4
def digit_sum(n): 
    if n==0 or n==1: 
     return n 
    else: 
     return n+digit_sum(n-1) 

def digital_root(n): 

    if n<10: 
     return n 
    else: 
     return digit_sum((n // 10) + n % 10) 

總和我試圖用digit_sum計算的digital_root數字的總和有人可以幫我請一個遞歸函數。我正在嘗試使用digital_root的遞歸函數。設計使用digit_sum計算的數字

運行在Python殼文件:

digital_root(1969) 

這應該計算1 + 9 + 6 + 9 = 25然後自25大於10,那麼它應該計算其數字的總和2 + 5,從而最終的答案是7

+3

如果您舉例說明您希望函數使用的樣子以及輸入和預期輸出值,將會有所幫助。 – pygeek

+0

您是否嘗試添加打印語句以查看計算出錯的位置? –

+1

您的數字總和功能是錯誤的,至少是遞歸部分。 – TheChetan

回答

5

爲了得到一個(正整數)的最後一位號碼,你可以計算出模:

last_digit = n % 10 

的數量(不包括最後的地方)的其餘部分:

rest = (n - last_digit)/10 

這在理論上應該足夠拆分號並添加數字:

def sum_digits(n): 
    if n < 10: 
     return n 
    else: 
     last_digit = n % 10 
     rest = n // 10 
     # or using divmod (thanks @warvariuc): 
     # rest, last_digit = divmod(n, 10) 
     return last_digit + sum_digits(rest) 

sum_digits(1969) # 25 

如果你想,直到你有一個值小於10,你只需要調用這個應用此recursivly只要該條件不滿足功能:

def sum_sum_digit(n): 
    sum_ = sum_digit(n) 
    if sum_ < 10: 
     return sum_ 
    else: 
     return sum_sum_digit(sum_) 

sum_sum_digit(1969) # 7 

只是如果你有興趣另一種方式來計算的數字之和是由數字轉換爲字符串,然後加字符串的每個字符:

def sum_digit(n): 
    return sum(map(int, str(n))) 
    # or as generator expression: 
    # return sum(int(digit) for digit in str(n)) 
+1

https://docs.python.org/3/library/functions.html#divmod – warvariuc

+1

@warvariuc我總是想知道那個函數是什麼好的。我添加它作爲替代。謝謝! – MSeifert

+0

我不能使用MSeifert的方法。我需要使用我的digit_sum函數。 –

1

試試這個...

digitSum = 0 
solution = 0 
S = raw_input() 
S = list(map(int, S.split())) 
#print S 
for i in S: 
    digitSum += i 
#print digitSum 
singleDigit = len(str(digitSum)) == 1 
if singleDigit == True: solution = digitSum 
while singleDigit == False: 
    solution = sum([ int(str(digitSum)[i]) for i in range(0, len(str(digitSum))) ]) 
    digitSum = solution 
    singleDigit = len(str(solution)) == 1 
print(solution) 
2

如果你真的需要,而無需使用任何循環(forwhile)遞歸解決方案,那麼你可以隨時再改乘保證單位:

def digital_root(n): 
    if n < 10: 
     return n 
    a, b = divmod(n, 10) 
    b += digital_root(a) 
    return digital_root(b) 

>>> digital_root(1969) 
7 

或者你可以不會迭代都:

def digital_root(n): # n > 0 
    return 1+(n-1)%9 

>>> digital_root(1969) 
7