gpt4 book ai didi

python - 递归函数中的返回

转载 作者:IT老高 更新时间:2023-10-28 21:46:47 25 4
gpt4 key购买 nike

刚开始学习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 5
this should be real value None

但我期待:

45
real value 5
this should be real value 5

我尝试在 if 之外添加 return x 并获得了默认输入值。谁能解释一下 return 是如何工作的?

最佳答案

您调用 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 将返回给你的调用者,不管你是否调用了任何其他函数那个分支,不管你调用什么函数会返回什么,也不管你调用的函数是否恰好是你所在的函数。

关于python - 递归函数中的返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11356168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com