3 回答
TA贡献1845条经验 获得超8个赞
您调用test(45)。这会测试,是否45 > 9为true,因此它将调用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无论您是否在该分支中调用任何其他函数,无论该函数可能会返回什么内容,都会将其返回给调用者,并且无论您调用的函数是否恰好与您所在的函数相同。
添加回答
举报