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

时间:2016-02-09 10:42:44

标签: 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
    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 个答案:

答案 0 :(得分:2)

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

  1. 在第一次通话时,total被分配了值1n变为42else分支被执行。
  2. 第二次通话时,total的值为3n变为4。执行if分支,值total = 7return
  3. 那么,为什么我们看到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
    

    正如您所注意到的,第一次通话接收到第二次通话返回的值,但第一次通话不会返回第二次通话返回的值,所以这就是你看到None的原因。

    但为什么第一次调用会返回第二次调用返回的值?

    由于这一行:

    else:
        digit_sum(n)
    

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

    希望它有所帮助! :)

答案 1 :(得分:2)

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

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

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

示例

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

让我们来看看阶乘:

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

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

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

    1. return(4 * fact(3))

    2. 返回(4 *(3 * fact(2)))

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

这给了24。

  • 以下是没有:

    的人
    1. (4 * fact(3))

    2. (4 *(3 *事实(2)))

    3. (4 *(3 *(2)))

所以进行了微积分,但没有返回。

我希望这会帮助你理解。

注意:Here是一个解释递归的因子实现。

答案 2 :(得分:0)

我的解决方案是

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

输出:

f(12345) = 15