[英]Python recursion and return
我是递归概念的新手,在我的编码经验中从未实践过这种魔法。 我对 Python 递归真正感到困惑的是“返回”的使用。 更具体地说,我不太明白在某些情况下何时使用 return 。 我见过在递归之前使用 return 的情况,并且根本不需要 case return。
例如:
一个 Leetcode 问题:“给定二叉搜索树(BST)的根节点和一个值。你需要在 BST 中找到该节点的值等于给定值的节点。返回以该节点为根的子树。如果这样的节点不存在,您应该返回 NULL。”
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def searchBST(self, root, val):
"""
:type root: TreeNode
:type val: int
:rtype: TreeNode
"""
if root == None:
return root
if root.val == val:
return root
elif root.val > val:
return self.searchBST(root.left,val)
else:
return self.searchBST(root.right,val)
为什么我需要返回“self.searchBST(root.left,val)”和“self.searchBST(root.right,val)”? 如果这两行都没有加return,程序是不是还会递归运行,直到满足root.val == val或root== None的条件,返回一个值? (我知道实际情况并非如此,我只是想将其概念化)。
此外,有人可以向我展示在递归中使用 return 的一般指南吗? 先感谢您!
如果你只是写:
self.searchBST(root.left,val)
代替
return self.searchBST(root.left,val)
它将执行递归搜索,但不会将结果返回到调用它的块。 当它达到您想要的值(或找不到它)时,该调用将执行
return root
但是之前的调用只会丢弃这个值,而不是将它返回到递归链中。
return
语句退出当前运行的函数并返回一个返回值,然后它可以像 Python 中的任何其他值一样使用:分配给一个变量,作为参数传递给另一个函数,或者......作为返回值返回调用函数。
def some_func():
return 'result'
x = some_func() # after this, x == 'result'
如果你调用一个函数而不捕获返回值,它就会丢失。 所以,如果你只是调用some_func()
,它就会被执行。
some_func() # this works, but 'result' is lost
调用另一个函数的函数也是如此,即使另一个函数是它本身:
def some_other_func1():
x = some_func()
return x
def some_other_func2():
return some_func() # exact same result as some_other_func1()
def some_recursive_func(n):
if n == 0:
print('Reached the end')
return n
else:
print(f'At {n}, going down')
return some_recursive_func(n-1)
print(some_recursive_func(3)) # prints a bunch of lines, but always prints `0` at the end
让我们举一个更简单的例子,您也可以将相同的逻辑应用于您的方法,
def fact(n):
#Base case
if n in [0, 1]:
return 1
#Recursion. Eg: when n is 2, this would eventually become 2 * 1 and would be returning 2 to the caller
return n * fact(n-1)
一般来说,递归函数有两种情况,一种是基本情况,另一种是对 self 的递归调用。 请记住,这是一个函数,理想情况下应该向调用者返回一些东西。 这就是需要return
语句的地方。 否则你不会向调用者返回正确的值。
如果这两行都没有加return,程序会不会一直递归运行,直到满足root.val == val或root== None的条件,返回一个值
返回值是。 但它会返回到之前的调用(等等),因此它会返回到self.searchBST(root.left,val)
或self.searchBST(root.right,val)
。 您仍然需要从这一点返回到函数的调用者。 因此,您需要return self.searchBST(root.left,val)
或return self.searchBST(root.right,val)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.