Python递归调用中return的作用机制及场景疑问
递归函数中return的作用差异:列表反转vs求和
我写了两个用递归反转列表的Python函数,Function 1在递归调用前加了return,导致递归返回后后面的代码根本没执行;Function 2删掉return后,就能正常输出反转后的内容。同时我有个疑问:为什么列表求和的递归函数必须用return,而这个反转列表的递归却不需要?
Function 1(带return,执行异常)
a=[1,5] def rev(k,i): if i==len(k)-1: print("in base case {}".format(i)) print(a[i]) print("Return from base case") else: print("in else before recur call {}".format(i)) return rev(k,i+1) print("in else after recur call {}".format(i)) print(a[i]) rev(a,0)
输出(Function 1)
in else before recur call 0 in base case 1 5 Return from base case
Function 2(去掉return,执行正常)
a=[1,5] def rev(k,i): if i==len(k)-1: print("in base case {}".format(i)) print(a[i]) print("Return from base case") else: print("in else before recur call {}".format(i)) rev(k,i+1) print("in else after recur call {}".format(i)) print(a[i]) rev(a,0)
输出(Function 2)
in else before recur call 0 in base case 1 5 Return from base case in else after recur call 0 1
列表求和递归函数示例
def getSum(piece): if len(piece)==0: return 0 else: return piece[0] + getSum(piece[1:]) print(getSum([1, 3, 4, 2, 5]))
问题解答
为什么Function 1的后续代码不执行?
Python里return语句的作用是终止当前函数执行,并把值返回给调用者。Function 1的else分支里,return rev(k,i+1)会直接结束当前函数,所以后面的两行print代码永远不会被执行,自然看不到反转的完整输出。为什么求和递归需要return,反转这里不需要?
核心区别在于函数的目的和是否需要传递值:
- 求和递归的目标是计算并返回列表的总和,每一层递归都需要把当前元素的值,加上下一层递归返回的子列表总和,再把这个结果返回给上层。没有
return的话,上层函数拿不到下层的计算结果,根本没法完成求和。 - 你写的反转函数,只是在递归过程中直接打印元素,它不需要把任何计算结果返回给上层函数——只要递归调用完成后,继续执行当前层的打印操作就行。整个过程不需要传递返回值,所以不需要
return。
如果你的反转函数是要生成一个新的反转列表并返回(而不是打印),那同样需要return,比如:
def reverse_list(lst): if not lst: return [] return reverse_list(lst[1:]) + [lst[0]]
这种情况下,每一层递归都要把反转后的子列表和当前元素拼接,再返回给上层,必须用return传递这个拼接后的列表。
内容的提问来源于stack exchange,提问作者Amarjeet Kushwaha
相关产品推荐
相关产品推荐

