在Python中递归计算数字的位数之和
我在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
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我试着用一个例子来解释它,但理解它的一种方法是打印中间结果。你添加的例子让我明白了所有的不同。谢谢。谢谢你的详细解释,我现在明白了为什么它不起作用了。;)谢谢你的详细解释,我现在明白它为什么不起作用了