我在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。
你能帮我理解为什么吗?
谢谢。
答案 0 :(得分:2)
有趣的问题,一个有趣的解决方案!让我用更简单的数字进行调试 - 421 。
total
被分配了值1
,n
变为42
。 else
分支被执行。total
的值为3
,n
变为4
。执行if
分支,值total = 7
为return
。 那么,为什么我们看到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':
return(4 * fact(3))
返回(4 *(3 * fact(2)))
返回(4 *(3 *(2)))
这给了24。
以下是没有:
的人(4 * fact(3))
(4 *(3 *事实(2)))
(4 *(3 *(2)))
所以进行了微积分,但没有返回。
我希望这会帮助你理解。
注意:Here是一个解释递归的因子实现。
答案 2 :(得分:0)
我的解决方案是
def f(n):
if n/10 == 0:
return n
return n%10 + f(n/10)
输出:
f(12345) = 15