首页 文章

递归函数添加所有数字

提问于
浏览
3

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

    您可以使用您的方法进行微小修改:

    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
    
  • 0

    问题是这条线

    return digit_sum(n//10) + n%10
    

    因为如果 n//10 和最后一位数字的总和变为两位数,则没有人减少它 . 可能的解决方案是:

    return digit_sum(digit_sum(n//10) + n%10)
    
  • 1

    试试这个:

    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
    
  • 1

    您可以执行以下操作:

    def digit_sum(n): 
        if n < 10:
            return n    
        return digit_sum(sum(map(int, str(n))))
    
  • 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***
    

相关问题