您调用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 的一个手臂中),那么None 将返回给您的调用者,无论您是否调用该分支中的任何其他函数,无论该函数可能返回什么如果您确实调用了某些东西,并且无论您调用的函数是否恰好是您所在的函数。