为了账号安全,请及时绑定邮箱和手机立即绑定

Python递归和返回

Python递归和返回

Helenr 2022-01-18 21:10:52
我是递归概念的新手,在我的编码经验中从未练习过这种魔法。我对 Python 递归感到非常困惑的是“return”的使用。更具体地说,我不太明白在某些情况下何时使用 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 = Noneclass 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 的一般准则吗?先感谢您!
查看完整描述

3 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

如果你只写:

self.searchBST(root.left,val)

代替

return self.searchBST(root.left,val)

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

return root

但是之前的调用只会丢弃这个值,而不是把它返回到递归链中。


查看完整回答
反对 回复 2022-01-18
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

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


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)

一般来说,递归函数有两种情况,一种是基本情况,另一种是对自身的递归调用。请记住,这是一个函数,理想情况下应该向调用者返回一些东西。这就是return需要声明的地方。否则,您将不会向调用者返回正确的值。


如果这两行都没有加return,程序是不是还要递归运行,直到满足root.val == val或者root== None的条件,并返回一个值


返回值是。但它会返回到之前的调用(等等),因此它会返回到self.searchBST(root.left,val)or之一self.searchBST(root.right,val)。您仍然需要从该点返回到函数的调用者。因此,您需要拥有return self.searchBST(root.left,val)or return self.searchBST(root.right,val)。


查看完整回答
反对 回复 2022-01-18
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

语句退出当前正在运行的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


查看完整回答
反对 回复 2022-01-18
  • 3 回答
  • 0 关注
  • 275 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号