我在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 回答
有趣的问题,一个有趣的解决方案!让我用更简单的数字调试 - 421 .
第一次调用时,
total
被赋值1
,n
变为42
.else
分支被执行 .第二次调用时,
total
获取3
的值,n
变为4
. 执行if
分支,值total = 7
为return
ed .So, why are we seeing the 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子句中添加return语句 .
添加'return digit_sum(n)'可以解决您的问题:
Example
当你有一个递归函数时(我会以n!为例),调用直到你达到'基本情况'(n为2!如果n <10则为你) .
我们来看看阶乘:
如果没有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是一个因子实现,其中解释了递归 .
我的解决方案是
输出: