你调用test(45)
. 这将测试是否45 > 9
为真,因此它调用test(35)
(45 - 10),而不返回其结果。同样的事情发生在test(25)
and test(15)
,直到 finallytest(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
),那么None
将返回给你的调用者,无论你是否调用了该分支中的任何其他函数,无论如果你调用某些东西,该函数可能会返回什么,并且无论您调用的函数是否恰好与您所在的函数相同。