考虑以下示例:
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
语句,程序的实际输出就会混淆。
答案 0 :(得分: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
答案 1 :(得分:2)
返回的功能是for循环结束(因为它结束的功能)。没有回报,它继续(为什么不会),然后代码不能很好地工作。
提示:如果这让您感到困惑,那么获取笔和纸并一步一步手工完成代码是一个好主意。
答案 2 :(得分:0)
如果不返回,则无法调用下一个将采用现在更新的值并对其进行进一步更改的函数。
一个人使用递归,因为他不想使用循环或将值返回给变量,并在循环的帮助下反复调用函数。
这不仅会在更大的程序中占用更多内存,还会增加代码行。
相反,人们可以简单地使用递归调用,这不仅会减少内存使用,还会减少代码行,并且在某种程度上也会简化程序。