Python 递归及目录遍历

递归调用:一个函数,调用了自身,称为递归调用

递归函数:一个会调用自身的函数

凡是循环能做的事,递归都能做。

 

目录

递归示例

普通方法实现

递归方式实现

计算分析:

递归遍历目录

引入os

遍历目录

执行结果

模拟栈结构

压栈

出栈

模拟栈遍历目录(深度)

图解

引入os

遍历目录

执行结果

队列

引入类库

创建队列

进队

出队

队列遍历目录(广度)

图解

引入类库

遍历目录

执行结果

总结


递归示例

输入一个整数,求1+2+3+......+n的和

普通方法实现

使用for循环方式,在循环中累加计算总和。

示例如下:

def sum1(n):""" 普通方法实现求n相加之和 """sum = 0for x in range(1, n + 1):sum += xreturn sumprint(sum1(100))
# 执行结果
# 5050

递归方式实现

需要改换方式,通过反复调用同一个方法也就是本身来实现数字总和计算。

计算分析:

sum2(0) = 0

sum2(1) = 1

sum2(2) = 2 + sum2(1)

sum2(3) = 3 + sum2(2)

sum2(4) = 4 + sum2(3)

示例如下:

def sum2(n):"""递归方法实现求n相加之和 """if n in (0, 1):return nelse:return n + sum2(n - 1)print(sum2(100))
# 执行结果
# 5050

递归遍历目录

引入os

示例如下:

import os

遍历目录

使用os函数去检索和判断目录和文件进行分别处理。

示例如下:

def get_all_dir(path, space=''):# 得到当前目录下所有的文件列表dirs = os.listdir(path)space += '--'for fileName in dirs:# 判断是否是目录(绝对路径)abdPath = os.path.join(path, fileName)if os.path.isdir(abdPath):print(space + '目录:', fileName)# 递归调用get_all_dir(abdPath, space)else:print(space + '普通文件:', fileName)get_all_dir(r'E:\lianxipy\huahua')

执行结果

--普通文件: aixin.py
--普通文件: aixin2.py
--普通文件: demo.py
--普通文件: dog.py
--普通文件: dongwu.py
--目录: img
----普通文件: duolai.jpg
----普通文件: duolai2.png
----普通文件: lianhua.jpg
----普通文件: qie.jpg
----普通文件: qie2.jpg
----普通文件: tiaowa.png
----普通文件: tiaowa2.jpg
----普通文件: tiaowa3.jpg
----普通文件: tree.jpg
----普通文件: VCG211171443872.jpg
----普通文件: VCG211171443874.jpg
----普通文件: VCG41N1156862653.jpg
----普通文件: VCG41N1255524799.jpg
----普通文件: VCG41N689213498.jpg
----普通文件: VCG41N882899088.jpg
--普通文件: min_yellow.py
--普通文件: shu.py
--普通文件: tree.py
--普通文件: wuhuan.py
--普通文件: yu.py

模拟栈结构

下面将模拟栈结构向其中添加数据,在做出栈操作(先入后出)。

压栈

设定栈变量,并通过append方法每次向其中添加一个名称数据。

示例如下:

stack = []# 压栈(向其中添数据)
stack.append('zhangsan')
print(stack)
stack.append('lisi')
print(stack)
stack.append('wangwu')
print(stack)# 执行结果
# ['zhangsan']
# ['zhangsan', 'lisi']
# ['zhangsan', 'lisi', 'wangwu']

出栈

通过pop方法每次出栈一个数据,出栈方式为:先入后出。

示例如下:

print('出栈:', stack.pop())
print('出栈:', stack.pop())
print('出栈:', stack.pop())
print('结果:', stack)# 执行结果
# 出栈: wangwu
# 出栈: lisi
# 出栈: zhangsan
# 结果: []

模拟栈遍历目录(深度)

图解

引入os

示例如下:

import os

遍历目录

示例如下:

def get_all_dir_stack(path):stack = []stack.append(path)# 处理栈, 当栈为空的时候结束训话while len(stack) != 0:# 从站里取出数据dirPath = stack.pop()files = os.listdir(dirPath)# 处理每一个文件,如果普通文件就打印# 如果是一个目录就将该目录压栈for fileName in files:absPath = os.path.join(dirPath, fileName)if os.path.isdir(absPath):print('目录:', fileName)stack.append(absPath)else:print('普通文件:', fileName)get_all_dir_stack(r'E:\lianxipy\huahua')

执行结果

普通文件: aixin.py
普通文件: aixin2.py
普通文件: demo.py
普通文件: dog.py
普通文件: dongwu.py
目录: img
普通文件: min_yellow.py
普通文件: shu.py
普通文件: tree.py
普通文件: wuhuan.py
普通文件: yu.py
普通文件: duolai.jpg
普通文件: duolai2.png
普通文件: lianhua.jpg
普通文件: qie.jpg
普通文件: qie2.jpg
普通文件: tiaowa.png
普通文件: tiaowa2.jpg
普通文件: tiaowa3.jpg
普通文件: tree.jpg
普通文件: VCG211171443872.jpg
普通文件: VCG211171443874.jpg
普通文件: VCG41N1156862653.jpg
普通文件: VCG41N1255524799.jpg
普通文件: VCG41N689213498.jpg
普通文件: VCG41N882899088.jpg

队列

引入类库

创建队列需要引入类库来实现。

示例如下:

import collections

创建队列

调用collections的deque方法来创建一个队列。

示例如下:

queue = collections.deque()
print(queue)# 执行结果
# deque([])

进队

向队列中加入三个人员名称,最后可看到队列中增加了三个数据。

示例如下:

queue.append('zhangsan')
print(queue)
queue.append('lisi')
print(queue)
queue.append('wangwu')
print(queue)# 执行结果
# deque(['zhangsan'])
# deque(['zhangsan', 'lisi'])
# deque(['zhangsan', 'lisi', 'wangwu'])

出队

使用popleft方法将队列中的数据一个个的出队。

示例如下:

print('出队:', queue.popleft())
print('出队:', queue.popleft())
print('出队:', queue.popleft())
print('结果:', queue)# 执行结果
# 出队: zhangsan
# 出队: lisi
# 出队: wangwu
# 结果: deque([])

队列遍历目录(广度)

图解

引入类库

引入类库os和队列使用的collections。

示例如下:

import os
import collections

遍历目录

示例如下:

def get_all_dir_queue(path):# 创建队列queue = collections.deque()# 进队queue.append(path)while len(queue) != 0:# 出队数据dirPath = queue.popleft()# 找出所有的文件dirs = os.listdir(dirPath)for fileName in dirs:# 绝对路径absPath = os.path.join(dirPath, fileName)# 判断是否目录,是目录就进队,不是就打印if os.path.isdir(absPath):print('目录:', fileName)queue.append(absPath)else:print('普通文件:', fileName)get_all_dir_queue(r'E:\lianxipy\huahua')

执行结果

普通文件: aixin.py
普通文件: aixin2.py
普通文件: demo.py
普通文件: dog.py
普通文件: dongwu.py
目录: img
普通文件: min_yellow.py
普通文件: shu.py
普通文件: tree.py
普通文件: wuhuan.py
普通文件: yu.py
普通文件: duolai.jpg
普通文件: duolai2.png
普通文件: lianhua.jpg
普通文件: qie.jpg
普通文件: qie2.jpg
普通文件: tiaowa.png
普通文件: tiaowa2.jpg
普通文件: tiaowa3.jpg
普通文件: tree.jpg
普通文件: VCG211171443872.jpg
普通文件: VCG211171443874.jpg
普通文件: VCG41N1156862653.jpg
普通文件: VCG41N1255524799.jpg
普通文件: VCG41N689213498.jpg
普通文件: VCG41N882899088.jpg

总结

本篇主要是递归介绍、计算数字总和、遍历目录及模拟栈、队列应用和遍历目录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM的小儿肺炎知识管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

MobileNet网络

介绍 MobileNet 网络专注于移动端或者嵌入式设备中的轻量级CNN网络,相比传统卷积神经网络,在准确率小幅降低的前提下大大减少模型参数与运算量(相比VGG16准确率减少了0.9%,但模型参数只有VGG的1/32) 网络中的亮点&am…

Go 语言开发工具

Go 语言开发工具 VSCode VScode 安装教程参见:https://www.kxdang.com/topic//w3cnote/vscode-tutorial.html 然后我们打开 VSCode 的扩展(CtrlShiftP): 搜索 go: 点击安装,安装完成后我们就可以使用代码…

利用知识付费小程序,我有才打造高效的知识传播渠道

在当今信息爆炸的时代,知识管理已经成为了每个人必须面对的问题。然而,市面上的知识付费平台大多数都是通用的,无法满足个性化需求。 因此,我有才提供了一款专属定制的适合个人的知识付费平台。核心产品能力如下: 一…

spingboot生产环境启动异常处理:Could not initialize ValueExtractorManager

今天在做将本地的springboot项目通过docker的方式部署到生产环境的工作时,发现docker下的jar包启动后包下面异常,经过网上调研,一开始都是说是包冲突之类的文章,尝试添加相关包未解决。后又遇到说是tomcat版本问题,觉得…

Java:TCP 通信方法(基本发送 + 接收)并 实现文件传输且反馈

TCP 通信编程 TCP:是一种可靠的网络协议,再通信两端都建立一个Socket对象。 通信之前要保证连接已经建立。 通过Socket产生IO流进行通信。 创建对象时,会连接服务器,连接不上,会报错。 所以,先运行服务端,再…

6大最佳目标进度管理软件盘点——团队/个人

在当今快节奏的生活和工作中,有效地管理目标和任务对于每个人来说都至关重要。在工作中,我们需要清晰地规划项目目标、安排任务和追踪进度;在生活中,我们也需要合理安排时间、记录重要事项以及追踪个人目标的实现进度。为了更好地…

【Maven技术专题】「知识盲区」教你如何使用深入分析Maven配置私服仓库的使用指南(基础篇)

Maven私服的使用实战 将内部构件部署到私服仓库什么是仓库和仓库组远程仓库的定义仓库定义基本结构仓库结构的属性介绍 部署部件到远程仓库远程仓库的认证用户名密码认证案例参考 私钥进行鉴权 镜像mirror镜像仓库的工作原理 将内部构件部署到私服仓库 如果想先学好什么如何将…

云原生周刊:Kubernetes v1.29 新特性一览 | 2023.12.11

开源项目推荐 kubedog Kubedog 是一个用于在 CI/CD 部署管道中监视和跟踪 Kubernetes 资源的库。 这个库被用于 werf CI/CD 工具中,在部署过程中跟踪资源。 RunWhen Local runwhen-local 是一个工具,用于在本地环境中运行 runwhen 脚本。runwhen 是…

vue面试题总结

Vuex和redux有什么区别?他们的共同思想是什么? Vuex 和 Redux 都是用于管理状态的状态管理库,它们在不同的前端框架中有着相似的思想,但也有一些关键的区别。 区别: 框架依赖: Vuex 是为 Vue.js 框架设计…

完爆MyBatis-Plus?来领略一下 MyBatis-Flex 的优雅魅力!

目录 一、Mybatis-Flex的有什么特点? 二、Mybatis-Flex和同类框架对比 2.1、功能对比 2.2、性能对比 三、Mybatis-Flex支持的数据库类型 四、Mybatis-Flex快速入门 Mybatis-Flex 是一个优雅的 Mybatis 增强框架,它非常轻量、同时拥有极高的性能与灵…

Golang WebView:打造跨平台的桌面应用

引言 随着互联网的发展和智能设备的普及,Web应用成为了主流的应用开发方式之一。然而,有些场景下仍然需要使用桌面应用来满足特定的需求。为了结合Web技术和桌面应用的优势,Golang提供了一种名为"WebView"的库,它可以帮…

AMEYA360:海康存储PCIe4.0固态硬盘A4000介绍

海康存储即将发布PCIe4.0固态硬盘新品A4000,搭载全新定制主控及高品质3D NAND闪存颗粒,最大顺序读取速度达7100MB/s,提供五年质保服务。 2022年,海康存储开始在PCIe 4.0固态硬盘领域全面发力,推出C4000 ECO、C4000等多…

【虹科干货】关于JSON数据库

文章速览: 什么是JSON什么是JSON数据库JSON数据库的显著优势关于JSON数据库的Q&A 如何理解JSON数据库?作为NoSQL数据库的一种类型,JSON数据库有哪些优势呢?JSON数据库如何运作,它为应用程序开发者带来了哪些价值呢…

【OpenVINO】使用OpenVINO实现 RT-DETR 模型 INT8量化推理加速

使用OpenVINO实现 RT-DETR 模型 INT8量化推理加速 1. 使用 OpenVINO 实现 RT-DETR 模型 INT8量化1.1 神经网络压缩框架 (NNCF)1.2 准备校准数据集1.2.1 下载COCO验证数据集1.2.2 Validator包装器1.2.3 转换用于量化的数据集 1.3 定义模型精度校验方法1.4…

DBA轻松应对慢查询挑战,使用NineData这款工具就够了!

对于一个 DBA 来说,从公司数据库系统的稳定程度可以看出他的能力几何,一个优秀的 DBA 不仅要保证数据库的稳定运行,还需要有能力有效处理数据库的各种突发性能问题,而最常见的性能问题,就是慢查询。 我们公司规模比较…

docker-compose 单机容器编排

docker-compose 单机容器编排 dockerfile:先配置好文件,然后build,镜像------->容器 docker-conpose既可以基于dockerfile,也可以基于镜像,一件事拉起镜像和容器。 docker-compose 核心就是yml文件,可…

Android共享元素动画

示例在两个 Activity 之间实现共享元素动画 首先&#xff0c;在布局文件中定义两个界面的 SurfaceView&#xff0c;并为它们设置相同的 android:transitionName 属性 <SurfaceViewandroid:transitionName"shared_sv"android:id"id/preview_surface"andr…

java正则表达式语法

java正则表达式语法 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 解密Java正则表达式语法&#xff1a;精通匹配规则&#xff0c;开启字符串之旅 正则表达式&am…

共享门店会在未来新零售占据主角吗?

共享门店作为一种创新的商业模式&#xff0c;在未来新零售领域中可能会占据一定的角色&#xff0c;但具体是否会成为主角&#xff0c;还需要根据市场的发展和技术的进步来判断。 首先&#xff0c;共享门店模式通过资源共享、风险共担、客户共享和收益共享等方式&#xff0c;为…