python - 为什么递归中必须使用return语句?

3 投票
3 回答
780 浏览
提问于 2025-04-18 02:30

考虑以下例子:

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

撰写回答