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.rhkb.cn/news/216213.html

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

相关文章

许战海战略文库|美国品牌实践:从品类品牌向产业品牌转变

引言:《品类战略》是上世纪70年代特劳特和里斯所推崇的定位理论,强调“品类聚焦是唯一正确的战略“新品类要使用新品牌”等战略思想,并对品牌延伸等多元化品牌进行批判,并由中国代理人传入中国,从2002年至今滋生了众多品类品牌,阻碍中国经济发展。 在今天…

招不到人?用C语言采集系统批量采集简历

虽说现在大环境不太好,很多人面临着失业再就业风险,包括企业则面临着招人人,找对口专业难得问题。想要找到适合自己公司的人员,还要得通过爬虫获取筛选简历才能从茫茫人海中找到公司得力干将。废话不多说,直接开整。 1…

python+appium自动化常见操作

1、点击、输入操作 #点击 driver.find_element(id,com.lemon.lemonban:id/navigation_my).click() #输入 driver.find_element(id,com.lemon.lemonban:id/et_password).send_keys(abc)2、隐形等待 driver.implicitly_wait(10)3、显性等待 #显性等待 locator (xpath,xpath) wai…

如雨后春笋般层出不穷的人工智能,究竟可以为我们的生活带来些什么?

似乎是从chatgpt爆火以后,各种各样的和AI、人工智能有关的产品层出不穷,似乎只有带有人工智能,才能体现一个产品的功能之强大,才能在众多产品中具有一定的竞争力,那么这样的现象会给我们的生活带来什么影响呢&#xff…

如何利用Axure制作移动端产品原型

Axure是一款专业的快速原型设计工具,作为专业的原型设计工具,Axure 能够快速、高效地创建原型,同时支持多人协作设计和版本控制管理。它已经得到了许多大公司的采用,如IBM、微软、思科、eBay等,这些公司都利用Axure 进…

案例041:基于微信小程序的私家车位共享系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

区块链媒体宣发:揭示优势与趋势,引领信息传播新时代

在数字化潮流中,区块链技术正以惊人的速度改变着传媒行业的格局。从区块链媒体宣发中获得的种种优势和未来的趋势,不仅为企业带来了新的推广途径,也在信息传播领域掀起了一场革命。本文将深入探讨区块链媒体宣发的优势以及未来的发展趋势。 1…

漏洞补丁存在性检测技术洞察

1、 漏洞补丁存在性检测技术是什么? 漏洞补丁存在性检测技术通俗的理解就是检测目标对象中是否包含修复特定已知漏洞的补丁代码,目标检测对象可能是源码,也能是二进制文件。 2、 漏洞补丁存在性检测技术业务背景 补丁检测这个问题背景是产品…

探索未来新趋势:鸿蒙系统的崭新时代

探索未来新趋势:鸿蒙系统的崭新时代 随着科技的不断发展,操作系统作为计算机和移动设备的核心,扮演着至关重要的角色。近年来,一种备受瞩目的操作系统——鸿蒙系统(HarmonyOS)崭露头角,正引领着…

二叉树(接口函数的实现)

今天继续来分享的是二叉树,我们废话不多说,直接来看下面的几个接口函数,然后我们把他们实现,我们就掌握二叉树的二分之一(今天粉丝破千了,属实有点高兴了)。 typedef char BTDataType;typedef s…

高项备考葵花宝典-项目进度管理核心方法加强理解-关键路径法

关键路径法(Critical Path Method,CPM)是一种基于数学计算的项目计划管理方法,是网络图计划方法的一种,属于肯定型的网络图。关键路径法将项目分解成为多个独立的活动并确定每个活动的工期,然后用逻辑关系&…

外包干了3年,技术退步太明显了。。。。。

先说一下自己的情况,本科生生,18年通过校招进入武汉某软件公司,干了差不多3年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能…

Unity 修改游戏对象的旋转角度Rotation的方法

在Unity中要修改游戏对象中的旋转角度,即下图中的Rotation: 有三个方法: 1、 使用欧拉角(Euler Angles):欧拉角是一组表示旋转的三个角度值(绕X轴的旋转、绕Y轴的旋转和绕Z轴的旋转)。 transf…

关于“Python”的核心知识点整理大全17

目录 ​编辑 8.3.4 结合使用函数和 while 循环 greeter.py 8.4 传递列表 greet_users.py 8.4.1 在函数中修改列表 printing_models.py 8.4.2 禁止函数修改列表 要将列表的副本传递给函数,可以像下面这样做: 往期快速传送门👆&#x…

导入pgsql中的保存的html数据到hive时,换行符无法被repalce

数据如图所示: 当我使用replace函数 \r\n 、\r 、 \n替换时。无论如何都无法替换 最终发现可以使用chr(ASCII码) 可以匹配到,坑我好久。 replace(replace(replace(replace(replace(bid_html_con, chr(9),),chr(10),),chr(13),),chr(160),),chr(32),)

深入源码解析ArrayList:探秘Java动态数组的机制与性能

文章目录 一、 简介ArrayList1.1 介绍ArrayList的基本概念和作用1.2 与数组的区别和优势 二、 内部实现2.1 数据结构:动态数组2.2 添加元素:add()方法的实现原理2.3 扩容机制:ensureCapacity()方法的实现原理 三、 常见操作分析3.1 获取元素&…

【UE】在蓝图中修改材质实例的参数的两种方式

目录 方式一、通过“在材质上设置标量/向量参数值”节点实现 方式二、通过“设置标量/向量参数值”节点实现 方式一、通过“在材质上设置标量/向量参数值”节点实现 1. 在材质中设置了两个参数 2. 创建材质实例 3. 创建一个蓝图,对静态网格体赋予材质实例 在事件…

控制笔记本电脑性能,增强性能/控制发热---Thinkpad x280

1、引言 手上有一台收来办公的Thinkpad x280,但安装的联想管家却没有性能调节选项,导致电脑性能释放很不顺手。由于有室外办公需求,也就有续航需求,也是让它减少发热;同时我想在室内的时候,完整发挥它的性能&#xff…

海思越影系列3516DV500/3519DV500/3519AV200/SD3403平台的AI一体化工业相机设计思路

随着工业自动化的发展,生产线对机器视觉的数量要求越来越多,由于数量的增加,视觉系统占的空间也越来越大,给生产线的布局带来困扰。 另一方面随着视觉SOC的发展,越来越多的视觉SOC都逐渐带有一定的算力,一体…

慢SQL的治理经验

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、慢SQL导致的后果 二、可能导致慢SQL的原因 三、如何发现慢SQL 3.1 JVM Sandbox 四、识别高危SQL 4.1 阿里的重点强制SQL规…