Chapter 42 递归

2024-08-21 08:36
文章标签 42 递归 chapter

本文主要是介绍Chapter 42 递归,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!

文章目录

  • 前言
  • 一、基本概述
  • 二、案例分析


前言

递归是一种在编程中广泛使用的技术,通过让函数调用自身来逐步解决问题。本章详细讲解了 Python 中递归的基本原理以及应用场景。


一、基本概述

①定义
递归指一个函数在其定义中直接或间接调用自身。递归问题通常可以分解成多个相似的子问题,从而简化复杂问题的求解。
在这里插入图片描述

递归通常由两部分组成:

  • 基准情况(Base Case):递归的终止条件。
  • 递归情况(Recursive Case):函数调用自身的部分,通常用于处理问题的子集。

递归的核心思想是将问题拆解为更小、更简单的子问题,直到达到基准情况。

②应用场景

  • 树结构遍历:
    树形结构,如文件系统、组织结构图、解析树等,通常使用递归来遍历或操作每个节点。
  • 图的深度优先搜索(DFS):
    在图的遍历中,递归可以用来实现深度优先搜索算法,适用于查找图中的路径、连通分量等。
  • 分治算法:
    许多经典的分治算法,如快速排序、归并排序,使用递归来将问题分解为更小的子问题,然后合并解决方案。
  • 数学计算:
    一些数学计算问题自然适合用递归解决,如阶乘、斐波那契数列等。

二、案例分析

【案例一:斐波那契数列】
斐波那契数列的定义如下:
F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2),当 n > 1
请使用递归计算斐波那契数列。

def fibonacci(n):# 基准情况if n <= 1:return n# 递归情况else:return fibonacci(n-1) + fibonacci(n-2)
# 测试
print(fibonacci(10))

输出结果:
55

【分析】
①基准情况:
如果 n 小于或等于 1(即 n == 0 或 n == 1),直接返回 n。这确保了递归在达到最简单的情况时停止。
②递归情况:
对于 n > 1,函数调用自身两次:fibonacci(n-1) 和 fibonacci(n-2)。这是通过递归计算前两个斐波那契数,然后将它们相加,得到当前的斐波那契数。
③计算过程:
调用 fibonacci(10) 时,代码会按照递归的方式逐步计算:

fibonacci(10)-> fibonacci(9) + fibonacci(8)-> (fibonacci(8) + fibonacci(7)) + (fibonacci(7) + fibonacci(6))-> ((fibonacci(7) + fibonacci(6)) + (fibonacci(6) + fibonacci(5))) + ((fibonacci(6) + fibonacci(5)) + (fibonacci(5) + fibonacci(4)))-> ...

这个递归过程会展开成一棵巨大的递归树,每个节点表示一个 fibonacci(n) 的计算。

F(2) = F(1) + F(0) = 1 + 0 = 1
F(3) = F(2) + F(1) = 1 + 1 = 2
F(4) = F(3) + F(2) = 2 + 1 = 3
F(5) = F(4) + F(3) = 3 + 2 = 5
F(6) = F(5) + F(4) = 5 + 3 = 8
F(7) = F(6) + F(5) = 8 + 5 = 13
F(8) = F(7) + F(6) = 13 + 8 = 21
F(9) = F(8) + F(7) = 21 + 13 = 34
F(10) = F(9) + F(8) = 34 + 21 = 55

每个 fibonacci 调用都会递归地计算两个更小的 fibonacci 值,直到达到基准情况。

【案例二:文件项目结构】
如图,在D:/Countries 文件夹内,有如下文件夹以及文本文件:
在这里插入图片描述
在D:/Countries/Cities 文件夹内,有如下文本文件:
在这里插入图片描述
请使用递归遍历D:/Countries 文件夹中的全部文件。

import osdef test_os():print(os.listdir("D:/test"))        # 列出路径下的内容# print(os.path.isdir("D:/test/a"))   # 判断指定路径是不是文件夹# print(os.path.exists("D:/test"))    # 判断指定路径是否存在def get_files_recursion_from_dir(path):"""从指定的文件夹中使用递归的方式,获取全部的文件列表:param path: 被判断的文件夹:return: list,包含全部的文件,如果目录不存在或者无文件就返回一个空list"""# 初始化一个空列表,用于存储找到的所有文件路径file_list = []if os.path.exists(path):for f in os.listdir(path):new_path = path + "/" + fif os.path.isdir(new_path):# 进入到这里,表明这个目录是文件夹不是文件file_list += get_files_recursion_from_dir(new_path)else:file_list.append(new_path)else:print(f"指定的目录{path},不存在")return []return file_listif __name__ == '__main__':print(get_files_recursion_from_dir("D:/Countries"))

输出结果:
[‘D:/Countries/A国.txt’, ‘D:/Countries/B国.txt’, ,‘D:/Countries/C国.txt’,‘D:/Countries/Cities/A市.txt’, ‘D:/Countries/Cities/B市.txt’, ‘D:/Countries/Cities/C市.txt’]

【分析】
①基准情况:

  • 目录不存在:函数需要终止递归,因为没有更多的目录可以处理。函数打印错误并返回空列表。
  • 目录为空:虽然不需要递归,但函数仍需处理这种情况以返回结果。函数返回包含找到的文件(如果有)的列表

②递归情况:

  • 处理子目录:递归调用自身来处理子目录中的文件。
  • 处理文件:将文件路径添加到结果列表中。

这篇关于Chapter 42 递归的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092657

相关文章

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速

Chapter 13 普通组件的注册使用

欢迎大家订阅【Vue2+Vue3】入门到实践 专栏,开启你的 Vue 学习之旅! 文章目录 前言一、组件创建二、局部注册三、全局注册 前言 在 Vue.js 中,组件是构建应用程序的基本单元。本章详细讲解了注册和使用 Vue 的普通组件的两种方式:局部注册和全局注册。 本篇文章参考黑马程序员 一、组件创建 ①定义 Vue 组件是一种具有特定功能的 Vue 实

Chapter 10 Stability and Frequency Compensation

Chapter 10 Stability and Frequency Compensation Chapter 8介绍了负反馈, 这一章介绍稳定性, 如果设计不好, 负反馈系统是要发生震荡的. 首先我们学习理解稳定判断标准和条件, 然后学习频率补偿, 介绍适用于不同运放的补偿方式, 同时介绍不同补偿对两级运放slew rate的影响, 最后介绍Nyquist’s判断标准 10.1 Gener

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的

数据库系统 第42节 数据库索引简介

数据库索引是数据库表中一个或多个列的数据结构,用于加快数据检索速度。除了基础的B-Tree索引,其他类型的索引针对特定的数据类型和查询模式提供了优化。以下是几种不同类型的索引及其使用场景的详细说明和示例代码。 1. 位图索引 (Bitmap Index) 位图索引适用于具有少量不同值的列(例如性别、国家代码等),它使用位图来表示数据,从而提高查询效率。 适用场景:当列中的值域较小,且数据分布

【代码随想录训练营第42期 续Day52打卡 - 图论Part3 - 卡码网 103. 水流问题 104. 建造最大岛屿

目录 一、做题心得 二、题目与题解 题目一:卡码网 103. 水流问题 题目链接 题解:DFS 题目二:卡码网 104. 建造最大岛屿 题目链接 题解:DFS  三、小结 一、做题心得 也是成功补上昨天的打卡了。 这里继续图论章节,还是选择使用 DFS 来解决这类搜索问题(单纯因为我更熟悉 DFS 一点),今天补卡的是水流问题和岛屿问题。个人感觉这一章节题对于刚

【UVA】10651-Pebble Solitaire(直接递归或者记忆化)

不知道这个题UVA的数据是怎么的,用2个方法交了,第一次直接递归,第二次记忆化剪枝,时间竟然一样!? 直接郁闷了,简单的二进制表示状态和二进制运算。 14145176 10651 Pebble Solitaire Accepted C++ 0.009 2014-09-04 09:18:21 #include<cstdio>#include<algorithm>#inclu

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置