首页 > 编程语言 >Python中 递归(Recursion)的使用浅析

Python中 递归(Recursion)的使用浅析

时间:2024-09-19 12:23:23浏览次数:12  
标签:right 递归 Python Recursion self 二叉树 root 浅析 left

递归的定义

递归是一种在函数定义中调用函数自身的编程技巧和算法设计方法。

递归中有两个关键要素

1.  递归的终止条件。当满足这个条件时,递归不再继续调用自身,而是开始返回结果。这也叫 递归基例(Base Case)。 如果没有正确设置递归基例,递归函数将无限地调用自身,直到耗尽系统资源(如栈空间),导致程序崩溃。

2. 递归的调用(Recursive Call),也就是调用自身函数

递归的使用场景

对于逐级迫进求解的情形,比如阶乘,树的深度等的程序设计情形,是使用递归的场景。类似功能的实现,在Python里面有迭代器和生成器(以类或函数为基础的单值生成器)。

对于简单的迭代,比如阶乘、斐波那契数列,用递归函数可以,但是不如迭代器、生成器高效,因为它们的本质是执行一次后停下再按要求执行下一次,而递归调用的本质是不断压栈,会占用大量的栈空间,如果递归深度过大(例如处理大规模数据或者复杂的递归结构时),可能会导致栈溢出错误。

但是对于树,似乎递归是合适的解法之一(DFS)。

所以要清楚递归的缺点 (from “豆包”): 

  • 递归调用会占用大量的栈空间,如果递归深度过大(例如处理大规模数据或者复杂的递归结构时),可能会导致栈溢出错误。

举例说明:

1. 阶乘 (个人认为,Python 中不推荐用递归来做这种实现,因为递归函数的缺点

def factorial(n):
    if n == 0:   #中止条件
        return 1 
    result = n * factorial(n - 1)  #调用自身
    return result

2. 倒数

def countdown(n):
    print(n)
    if n <= 0:  # 这是一个不调用自身的分支,是终止条件
        return
    countdown(n - 1)

 3. 判断二叉树的深度 (Leetcode 104 题)

LeetCode  -- 104. 二叉树的最大深度icon-default.png?t=O83Ahttps://leetcode.cn/problems/maximum-depth-of-binary-tree/

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    # 深度优先搜索
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if root == None:   #终止条件
            return 0
        l = self.maxDepth(root.left)    #对左分支调用自身
        r = self.maxDepth(root.right)   #对右分支调用自身
        return 1 + max(l, r)

4. 反转二叉树(LeetCode 226题)

LeetCode --  226. 翻转二叉树icon-default.png?t=O83Ahttps://leetcode.cn/problems/invert-binary-tree/

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    # 我的解法,用递归
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if root == None:
            return root
        root.left, root.right = root.right, root.left
        self.invertTree (root.left)
        self.invertTree(root.right)
        return root

标签:right,递归,Python,Recursion,self,二叉树,root,浅析,left
From: https://blog.csdn.net/m0_46699540/article/details/142356275

相关文章

  • Python实现GUI小工具CSV文件转Excel
    目录专栏导读库的安装代码总结专栏导读......
  • 如何用Python爬取全部ETF基金实时数据!
    一般来说,我们都是交易ETF基金,就是可以在股票交易所买卖的那种基金,而不是基金公司或者天天基金网提供的基金。因为ETF基金的交易方式类似股票,当时会比股票更有优势,这个具体我们就不展开讲,不然跑题了。言归正传,我们来爬取全部800多只ETF基金的数据。1).打开东财的网站,点击基金,......
  • Python单体类编写技巧与类装饰器应用
    在软件开发中,有时希望某个类只能生成一个实例,这种模式被称为单体模式(SingletonPattern)。单体类确保整个程序中只有一个类实例,从而在多线程环境或全局配置中保持状态一致。Python作为一门灵活的编程语言,提供了多种实现单体类的方法,包括使用类装饰器来简化单体类的实现。本文将......
  • 离线安装Python Library教程
    当你的设备不能联网,你该如何下载原来一行pip命令就能下载的Python库?别慌,没有你想象的那么麻烦。下面我将介绍常用的两种方法:通过源代码和通过wheel文件。一.通过wheel文件(.whl)首先搜索你想要下载的python库的pypi页面这里以numpy为例:进入页面后,点击Downloadfiles,进入......
  • Python 单元测试详解:Unittest 框架的应用与最佳实践
    Python单元测试详解:Unittest框架的应用与最佳实践文章目录Python单元测试详解:Unittest框架的应用与最佳实践一什么是Unittest1不使用Unittest测试框架2使用Unittest测试框架二unittest使用建议1先写测试case后写测试逻辑2测试文件以_test.py结尾......
  • Python 异常控制详解:try-except 的应用与多种异常处理策略
    Python异常控制详解:try-except的应用与多种异常处理策略文章目录Python异常控制详解:try-except的应用与多种异常处理策略一可遇见的异常二处理多个异常1多个异常一起处理2多个异常分开处理三try-except-else四try-except-finally五raise手动抛出异常六Pyt......
  • [Python数据可视化] Plotly:交互式数据可视化的强大工具
    引言:在数据分析和可视化的世界中,Plotly是一颗耀眼的明星。它是一个开源的交互式图表库,支持多种编程语言,包括Python、R和JavaScript。Plotly的强大之处在于它能够创建出既美观又具有高度交互性的图表,使得数据探索和分析变得更加直观和有趣。本文将详细介绍Plotly的功能,......
  • python 深度神经网络训练,pytorch ,tensorflow paddle大模型训练中损失突然增大的原因
    在机器学习和深度学习的训练过程中,损失函数的数值突然变高可能是由多种因素引起的。以下是一些可能的原因和相应的解决方案:1.**学习率设置不当**:如果学习率过高,可能会导致模型在优化过程中跳过最小值,甚至导致模型发散。相反,如果学习率过低,则可能导致模型训练速度过慢,甚至停滞......
  • Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码
    原文链接:https://tecdat.cn/?p=37724原文出处:拓端数据部落公众号 分析师:SikunChen在当今世界,粮食系统的稳定性至关重要。尽管现有的全球粮食系统在生产和分配方面表现出较高的效率,但仍存在大量人口遭受饥饿以及诸多粮食安全隐患。与此同时,在学术领域,准确评估情报学期刊的质......
  • Python中的元类:掌握类的创建与定制
    在面向对象编程中,类是组织代码的重要手段。但在Python中,类本身也是对象,这意味着它们可以被创建、修改甚至定制。元类(Metaclass)是Python中的一种高级特性,它允许你在类被创建时对其进行修改或增强。本文将带你深入了解元类的概念、作用以及如何在实践中使用元类。元类是什么......