Ale*_*Key 38 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)
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到:
45
real value 5
this should be real value None
Run Code Online (Sandbox Code Playgroud)
但我预计:
45
real value 5
this should be real value 5
Run Code Online (Sandbox Code Playgroud)
我尝试return x
在外面添加if
,我得到了默认输入值.任何人都可以解释一下return
有效吗?
Ben*_*Ben 61
你调用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
Run Code Online (Sandbox Code Playgroud)
你没有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
Run Code Online (Sandbox Code Playgroud)
使用'x = 45'调用的test(x)函数与调用相同test45(45)
.我希望你能明白为什么None
在不涉及递归时应该返回它.好吧,当涉及递归时,没有任何变化.该return
语句既不知道也不关心它是否从递归调用的函数返回,它在两种情况下的行为都完全相同.
事实上,递归并不是什么"特殊"的东西; 它的行为与普通函数调用完全相同.您从通过参数调用您的事物中接收信息,并通过返回将信息返回给调用您的事物.如果你没有返回某些东西(可能只在一个臂中if
),那么None
无论你是否调用该分支中的任何其他函数,都会返回给你的调用者,不管你在调用某些东西时该函数可能会返回什么,无论你调用的函数是否与你所在的函数相同.
Ant*_*ony 20
返回是缩进的,因此它只在else分支中执行.如果采用第一个分支,则该函数隐式返回None.
您需要将其更改为
return test(x-10)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
24799 次 |
最近记录: |