首页 文章

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

提问于
浏览
0

我在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

我获得以下输出:

The return value of the function is:  None
The final value stored in total is:  15

我的函数有点工作,因为存储在全局变量 total 中的最终值是正确的,但打印函数输出返回 None 而不是15 .

你能帮我理解为什么吗?

谢谢 .

3 回答

  • 2

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

    • 第一次调用时, total 被赋值 1n 变为 42 . else 分支被执行 .

    • 第二次调用时, total 获取 3 的值, n 变为 4 . 执行 if 分支,值 total = 7return ed .

    So, why are we seeing the None? 让我们检查一下调用堆栈:

    > digit_sum(n = 421)
    > > digit_sum(n = 42) # call to digit_sum from inside digit_sum
    > -< 7                # value returned by inner/second call
    > None
    

    您可以注意到,第二次调用返回的值由第一次调用接收,但第二次调用返回 first call doesn't return the value ,这就是您看到 None 的原因 .

    But why does't first call return the value being returned by the second call?

    因为这条线:

    else:
        digit_sum(n)
    

    您正在第二次调用该函数,但您没有返回其返回值 .

    希望能帮助到你! :)

  • 2

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

    添加'return digit_sum(n)'可以解决您的问题:

    if n < 10:
        total += n
        return total
    else:
        return digit_sum(n)
    

    Example

    当你有一个递归函数时(我会以n!为例),调用直到你达到'基本情况'(n为2!如果n <10则为你) .

    我们来看看阶乘:

    def fact(n):
        if(n<=2):
            return n
        else:
            return n*fact(n-1)
    

    如果没有else子句中的return语句,如果你要求事实(4),这也将不返回 .

    • 以下是带有return语句的'calls':

    • return(4 * fact(3))

    • return(4 *(3 * fact(2)))

    • 返回(4 *(3 *(2)))

    这给了24 .

    • 以下是没有:

    • (4 *事实(3))

    • (4 *(3 * fact(2)))

    • (4 *(3 *(2)))

    因此制作了微积分,但没有返回任何东西 .

    我希望这能帮助你理解 .

    注意:Here是一个因子实现,其中解释了递归 .

  • 0

    我的解决方案是

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

    输出:

    f(12345) = 15
    

相关问题