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
的递归函数。
在Python shell中运行文件:
digital_root(1969)
这应该计算1 + 9 + 6 + 9 = 25然后因为25大于10它应该计算其数字2 + 5的总和,以便最终答案是7。
答案 0 :(得分: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的值,你只需要调用这个函数,只要不满足这个条件:
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 :(得分:2)
如果你确实需要递归解决方案而不使用任何循环(for
,while
),那么你总是可以再次递归以确保单个数字:
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
答案 2 :(得分: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)