递归函数添加所有数字

时间:2017-12-05 06:57:51

标签: python function recursion

我想要得到所有数字的总和。允许解决这个问题的唯一方法是递归函数。但是,总和不应超过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

5 个答案:

答案 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***