Python递归并返回

时间:2019-04-23 05:37:44

标签: python recursion

我对递归的概念并不陌生,在我的编码经验中从未实践过这种魔术。我对Python递归真正感到困惑的是使用“返回”。更具体地说,我不太了解在某些情况下何时使用return。我已经看到了在递归之前使用return的情况,而根本不需要返回case的情况。

例如:

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)”?如果两行都没有添加任何返回值,则程序是否仍会递归运行,直到满足root.val == val或root == None的条件,并返回一个值? (我知道实际上不是这种情况,我只是想将其概念化。)

此外,有人可以向我展示在递归中使用return的一般准则吗?预先谢谢你!

3 个答案:

答案 0 :(得分:2)

如果您只写:

self.searchBST(root.left,val)

代替

return self.searchBST(root.left,val)

它将执行递归搜索,但不会将结果返回到调用它的块中。当达到所需的值(或找不到)时,该调用将执行

return root

但是上一个调用只会丢弃此值,而不是将其返回到递归链上。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

让我们举一个更简单的示例,您也可以将相同的逻辑应用于您的方法,

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)

通常,递归函数将有2种情况,一种是基本情况,另一种是对self的递归调用。记住,这是一个函数,理想情况下应该将某些内容返回给调用方。那就是需要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)