我想要得到所有数字的总和。允许解决这个问题的唯一方法是递归函数。但是,总和不应超过10.例如,如果给定n为38,则应返回2.(3 + 8 = 11,1 + 1 = 2)
我制作了以下代码。但是,它只返回11.我以许多不同的方式处理这个问题,例如嵌套的if和while循环,但我无法弄明白。有什么方法可以使用递归函数来解决这个问题吗?
def digit_sum(n):
if n//10 <= 0:
return n%10
return digit_sum(n//10) + n%10
答案 0 :(得分:1)
问题在于
行return digit_sum(n//10) + n%10
因为如果n//10
和最后一位数字的总和变为两位数,则没有人减少它。可能的解决方案是:
return digit_sum(digit_sum(n//10) + n%10)
答案 1 :(得分:1)
您可以稍加修改地使用您的方法:
def digit_sum(n):
if n<10:
return n
return (digit_sum(n//10) + n%10 - 1) % 9 + 1
或忽略递归要求:
def digit_sum(n):
return n if n<10 else (n-1) % 9 + 1
甚至更短(感谢@thanasisp):
def digit_sum(n):
return n and n%9 or 9
答案 2 :(得分:0)
试试这个:
def digit_sum(n):
""" Recursively add the digits of a positive integer until the sum
becomes a single digit. Return the sum. """
sum_of_digits = sum(int(digit) for digit in str(n))
if sum_of_digits < 10:
return sum_of_digits
else:
return digit_sum(sum_of_digits)
>>> digit_sum(38)
2
答案 3 :(得分:0)
您可以执行以下操作:
def digit_sum(n):
if n < 10:
return n
return digit_sum(sum(map(int, str(n))))
答案 4 :(得分:0)
这是一个不会强制转换为str的递归解决方案:
def digit_sum(n):
def _digit_sum(n):
if n == 0:
return n
return n % 10 + digit_sum(n//10)
s = _digit_sum(n)
if s > 9:
return digit_sum(s)
return s
def test_digit_sum():
n = 2
print(n, digit_sum(n))
assert digit_sum(n) == 2
n=10
print(n, digit_sum(n))
assert digit_sum(n) == 1
n=143
print(n, digit_sum(n))
assert digit_sum(n) == 8
n=1434
print(n, digit_sum(n))
assert digit_sum(n) == 3
n=143488837772
print(n, digit_sum(n))
assert digit_sum(n) == 8
print("***all tests pass***")
test_digit_sum()
2 2
10 1
143 8
1434 3
143488837772 8
***all tests pass***