Python 递归函数中的返回
我刚刚开始学习python(v3.2.3),在这个函数中遇到了一个关于Python 递归函数中的返回,python,recursion,return,Python,Recursion,Return,我刚刚开始学习python(v3.2.3),在这个函数中遇到了一个关于return的奇怪问题: def test(x): if x > 9 : test(x - 10) else: print('real value',x) return x x = int(input()) y = test(x) print('this should be real value',y) 当我运行它时,我得到: 45 real value
return
的奇怪问题:
def test(x):
if x > 9 :
test(x - 10)
else:
print('real value',x)
return x
x = int(input())
y = test(x)
print('this should be real value',y)
当我运行它时,我得到:
45
real value 5
this should be real value None
但我希望:
45
real value 5
this should be real value 5
我尝试在
if
之外添加returnx
,得到了默认的输入值。谁能解释一下return
是如何工作的吗?该返回是缩进的,因此它只在else分支中执行。如果执行第一个分支,则函数隐式返回None
您需要将此更改为
return test(x-10)
当
x>9
时,您忘记返回值。如果没有返回值,函数将“return”None
您调用的test(45)
。这将测试45>9是否为真,因此它调用test(35)
(45-10),而不返回其结果。同样的事情也发生在test(25)
和test(15)
上,直到最后调用test(5)
这将打印“实值5”,然后返回5。但是从函数返回结果总是将结果返回给该函数的直接调用方。它不会通过几个呼叫立即跳出;毕竟,调用方可能希望在将某些内容返回给其调用方之前对返回的结果进行处理。但是在这种情况下,只有test(5)
返回任何内容;所有其他调用test(x-10)
,等待它返回,忽略它返回的任何内容,然后(隐式地)返回None
。由于最外层的调用test(45)
就是这些情况之一,因此得到的是None
下面是对发生的事情进行可视化的尝试:
test(45):
| test(35):
| | test(25):
| | | test(15):
| | | | test(5):
| | | | | print('real value',5)
| | | | | return 5 to test(15)
| | | | return None to test(25)
| | | return None to test(35)
| | return None to test(45)
| return None
您没有在解释器中调用test(5)
,test(5)
是从另一个函数调用内部调用的。因此,从test(5)
返回到该函数调用。事实上,这是一个函数调用本身是完全无关的。如果代码如下所示,则会得到完全相同的结果:
def test45(x):
if x > 9 :
test35(x - 10)
else:
print('real value',x)
return x
def test35(x):
if x > 9 :
test25(x - 10)
else:
print('real value',x)
return x
def test25(x):
if x > 9 :
test15(x - 10)
else:
print('real value',x)
return x
def test15(x):
if x > 9 :
test5(x - 10)
else:
print('real value',x)
return x
def test5(x):
if x > 9 :
print 'No more tests :('
else:
print('real value',x)
return x
使用“x=45”调用的test(x)函数与调用test45(45)
相同。我希望您能理解为什么在不涉及递归的情况下,应该返回None
。好吧,当涉及递归时,没有任何变化。return
语句既不知道也不关心它是否从递归调用的函数返回,在这两种情况下,它的行为完全相同
事实上,递归一点也不“特别”;它的行为方式与普通函数调用完全相同。您通过参数从调用您的对象接收信息,然后通过返回将信息返回给调用您的对象。如果您不返回某个函数(可能仅在If
的一个臂中),则无
将返回给调用者,无论您是否调用该分支中的任何其他函数,也不管您调用某个函数时该函数可能返回什么,不管您调用的函数是否恰好与您所在的函数相同。因此,总而言之,我需要在这两个条件上都加上return,是吗?@AlexKey:在上面的代码中,是的,您将返回evaluationtest(x-10)的值
这是否意味着即使在假未执行的if条件下,我也需要返回?@AlexKey:是的。因为y
只分配了第一次函数调用的值。这不是Python所独有的。Python唯一独特的部分是,当没有return语句时,函数隐式返回None
。这与非递归调用完全相同:如果要从调用的函数传播返回值,必须使用return
关键字自己进行。调用一个函数会产生它的返回值,但不管被调用的函数是递归函数还是非递归函数,都取决于你如何处理这个返回值。这是否回答了你的问题?