在Python中递归计算数字的位数之和

在Python中递归计算数字的位数之和,python,recursion,sum,Python,Recursion,Sum,我在Python中使用递归函数时遇到问题。函数的目标是递归地计算数字的位数和 这就是我到目前为止所拥有的——我意识到这个版本并没有尽可能简洁,但现在我只是想理解为什么它不能正常工作: total = 0 #global variable declaration def digit_sum(n): global total #to be able to update the same variable at every level of recursion

我在Python中使用递归函数时遇到问题。函数的目标是递归地计算数字的位数和

这就是我到目前为止所拥有的——我意识到这个版本并没有尽可能简洁,但现在我只是想理解为什么它不能正常工作:

total = 0          #global variable declaration

def digit_sum(n):
    global total   #to be able to update the same variable at every level of recursion
    total += n % 10   #adding the last digit to the total
    n //= 10    #removing the last digit of the number
    if n < 10:
        total += n
        return total
    else:
        digit_sum(n)

print 'The return value of the function is: ', digit_sum(12345)
print 'The final value stored in total is: ', total
由于全局变量
total
中存储的最终值是正确的,因此我的函数在某种程度上正常工作,但打印函数输出时返回的是
None
,而不是15

你能帮我理解为什么吗


谢谢。

有趣的问题和有趣的解决方案!让我用一个更简单的数字来调试-421

  • 第一次调用时,
    total
    被分配值
    1
    n
    变为
    42
    。执行
    else
    分支
  • 在第二次调用时,
    total
    获取
    3
    的值,
    n
    变为
    4
    。执行
    if
    分支,值
    total=7
    return
    ed
  • 那么,为什么我们看到
    让我们检查一下调用堆栈:

    > digit_sum(n = 421)
    > > digit_sum(n = 42) # call to digit_sum from inside digit_sum
    > -< 7                # value returned by inner/second call
    > None
    
    您正在第二次调用该函数,但没有返回其返回值


    希望有帮助!:)

    有趣的问题,有趣的解决方案!让我用一个更简单的数字来调试-421

  • 第一次调用时,
    total
    被分配值
    1
    n
    变为
    42
    。执行
    else
    分支
  • 在第二次调用时,
    total
    获取
    3
    的值,
    n
    变为
    4
    。执行
    if
    分支,值
    total=7
    return
    ed
  • 那么,为什么我们看到
    让我们检查一下调用堆栈:

    > digit_sum(n = 421)
    > > digit_sum(n = 42) # call to digit_sum from inside digit_sum
    > -< 7                # value returned by inner/second call
    > None
    
    您正在第二次调用该函数,但没有返回其返回值


    希望有帮助!:)

    问题是您没有在else子句中添加return语句

    添加“返回数字总和(n)”应该可以解决您的问题:

    if n < 10:
        total += n
        return total
    else:
        return digit_sum(n)
    
    如果n<10:
    总数+=n
    返回总数
    其他:
    返回数字和(n)
    
    示例


    当您有一个递归函数(我将以n!为例)时,调用将一直进行,直到达到“基本情况”(n中的2),如果n,则问题在于您没有在else子句中添加return语句

    添加“返回数字总和(n)”应该可以解决您的问题:

    if n < 10:
        total += n
        return total
    else:
        return digit_sum(n)
    
    如果n<10:
    总数+=n
    返回总数
    其他:
    返回数字和(n)
    
    示例

    当你有一个递归函数(我将以n!为例)时,调用一直进行到你达到一个“基本情况”(n!中的2),如果n我的解决方案是

    def f(n):
        if n/10 == 0:
             return n
        return n%10 + f(n/10)
    
    输出:

    f(12345) = 15
    
    我的解决办法是

    def f(n):
        if n/10 == 0:
             return n
        return n%10 + f(n/10)
    
    输出:

    f(12345) = 15
    

    谢谢。这确实解决了问题,但说实话,我不明白为什么。@Baalinooo我试图用一个例子来解释它,但理解它的一种方法是打印中间结果。你添加的例子帮助我理解了所有的不同。谢谢。谢谢。这确实解决了问题,但说实话,我不明白“为什么?”Baalinooo我试着用一个例子来解释它,但理解它的一种方法是打印中间结果。你添加的例子让我明白了所有的不同。谢谢。谢谢你的详细解释,我现在明白了为什么它不起作用了。;)谢谢你的详细解释,我现在明白它为什么不起作用了