python - 为啥必须在递归中使用 return 语句?
Posted
技术标签:
【中文标题】python - 为啥必须在递归中使用 return 语句?【英文标题】:python - Why is it mandatory to use return statements in recursion?python - 为什么必须在递归中使用 return 语句? 【发布时间】:2014-05-26 21:05:48 【问题描述】:考虑以下示例:
class Parser:
def __init__(self):
while True:
input = raw_input("Logic: ")
if input == 'quit':
break
self.readFunction(input)
def readFunction(self, input):
for i, char in enumerate(input):
if input[i] == '(' and input[i+1] != ')':
print input[i+1:-1]
return self.readFunction(input[i+1:-1])
控制台中的输入如下所示:
user@laptop:~/Projects/pr$ python main.py
Logic: a(b(c(d(e()))))
b(c(d(e())))
c(d(e()))
d(e())
e()
(逻辑是用户输入)
我的问题: 为什么必须使用return self.readFunction(input[i+1:-1])
而不是self.readFunction(input[i+1:-1])
来完成递归?如果我省略return
语句,程序的实际输出就会混淆。
【问题讨论】:
你到底有什么不明白的?您必须使用return
,因为您希望函数返回一个值。
在这段代码中,return 似乎被用来跳出“for”循环。 self.readFunction 行之后的“中断”也可以完成同样的事情。
但它不返回任何值。 return 语句会中断 for 循环还是什么?因为如果我不使用 return 语句,不同的循环就会交织在一起。
@mkimball 谢谢!你能解释一下没有退货声明会发生什么吗?函数调用后循环是否继续?
是的,循环从它停止的地方继续,并重复打印传递给嵌套的 readFunction 调用的切片。
【参考方案1】:
如果不返回,您将无法调用下一个函数,该函数将采用现在更新的值并对它们进行进一步更改。
一个人使用递归是因为他不想使用循环或将值返回给变量并在循环的帮助下一遍又一遍地调用函数。
这不仅会在大型程序中占用更多内存,还会增加代码行数。
相反,人们可以简单地使用递归调用,这不仅会减少内存使用量,还会减少代码行数,并且在一定程度上还可以简化程序。
【讨论】:
【参考方案2】:使用 return 和递归并不是强制性的,尽管它通常使递归变得实用 - 是“强制”是编写一个等效算法。删除 return
会破坏这种等效性,即使实际返回值已被丢弃。
例如,break
的以下内容将起作用:
def readFunction(self, input):
for i, char in enumerate(input):
if input[i] == '(' and input[i+1] != ')':
print input[i+1:-1]
self.readFunction(input[i+1:-1])
# No return - but like return this EXITS THE LOOP
# when the termination condition is met.
break
# Breaks to here with an implicit "return None" at the end
【讨论】:
【参考方案3】:return的作用是for循环结束(因为它所在的函数结束了)。没有返回,它继续(为什么不呢)然后代码不能正常工作。
提示:如果这让您感到困惑,最好拿起笔和纸,一步一步地手动完成代码。
【讨论】:
这几乎可以清除它。最初,我认为如果没有 return 语句,新调用的函数和 for 循环都会继续并行执行,从而使代码无法工作。这是正确的吗? 没有“并行”,因为所有调用都发生在同一个线程上。但是,相同的数据由多个调用处理。 (按顺序,而不是并行。) 不,您必须做一些非常特殊的事情才能让事情在 Python 中并行运行。新调用的函数开始执行,在某个时刻完成,然后原始函数继续执行,就像它调用任何其他函数一样。在这种情况下,它将执行另一个递归调用,但使用不同的值i
(即下一个 (
的索引)。以上是关于python - 为啥必须在递归中使用 return 语句?的主要内容,如果未能解决你的问题,请参考以下文章