python - 为什么递归中必须使用return语句?
考虑以下例子:
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
这个语句,程序的实际输出就会混乱。
3 个回答
0
如果不返回值,你就无法调用下一个函数,而这个函数会使用现在更新后的值进行进一步的修改。
使用递归的原因是,有些人不想用循环,也不想把返回值存到一个变量里,然后再通过循环一次又一次地调用函数。
这样做不仅在大程序中会占用更多内存,还会增加代码的行数。
相反,使用递归调用可以减少内存的使用和代码的行数,并且在一定程度上还能简化程序。
2
return的作用是结束for循环(因为它所在的函数也结束了)。如果没有return,循环就会继续下去(为什么不继续呢),这样代码就会出现问题。
小贴士:如果这让你感到困惑,建议你拿出纸和笔,手动一步一步地理清代码的逻辑。
4
在使用递归的时候,并不是一定要用到返回值,虽然通常这样做会让递归更好用。真正“必须”的是要写出一个“等价”的算法。如果去掉了 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