Python 递归及目录遍历

news2024/11/24 0:15:25

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

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

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

 

目录

递归示例

普通方法实现

递归方式实现

计算分析:

递归遍历目录

引入os

遍历目录

执行结果

模拟栈结构

压栈

出栈

模拟栈遍历目录(深度)

图解

引入os

遍历目录

执行结果

队列

引入类库

创建队列

进队

出队

队列遍历目录(广度)

图解

引入类库

遍历目录

执行结果

总结


递归示例

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

普通方法实现

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

示例如下:

def sum1(n):
    """ 普通方法实现求n相加之和 """

    sum = 0
    for x in range(1, n + 1):
        sum += x
    return sum

print(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 n
    else:
        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.coloradmin.cn/o/1306985.html

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

相关文章

安防视频/可视化监控云平台EasyCVR对接大华卡口摄像头告警的操作步骤

旭帆科技的国标GB28181视频融合平台EasCVR不仅具备传统的视频监控功能,还配备了智能分析算法,近期有用户需要在现场的摄像头配备AI识别的功能,如烟火、人脸识别、车牌识别等功能。 最新版的EasyCVR(V.3.4)目前可对接大…

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

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

Linux基础项目开发2:物联网监控——MJP-streamer方案实现(二)

前言: MJPG-Streamer代码简单,并且对CPU的要求比较低,一般的处理器都能运行,我们可以通过它,大体了解一下视频监控的知识。 一、MJP-streamer 编译安装MJP-streamer 使用Buildroot编译 在100ASK_IMX6ULL上安装、运行 使…

通讯系列电路芯片选型分析

适用于电话机上的电路芯片D34018 工作电压范围6V~11V 采用SOP28封装形式 D34118 工作电压范围3.5V~6.5V 采用SOP28封装形式 压缩扩展器电路芯片D31101 D5015 D5020 窄带中频放大器电路D3361 D3380 D31136 收发器电路芯片 D232 低功耗3-5.5V供电RS-2…

-bash: docker-compose: 未找到命令

-bash: docker-compose: 未找到命令 我在使用Docker搭建Nacos容器时遇到了这个问题:是没有安装 docker-compose工具 。 docker-compose的用处主要体现在以下几个方面: 快速搭建开发环境:使用docker-compose可以快速搭建起开发环境&#xff0…

全球十大骨传导耳机排名,骨传导耳机排行榜品牌推荐

随着科技的进步,人们对音乐和通话的需求越来越高,而骨传导耳机作为一种新兴的耳机类型,逐渐受到人们的关注。它通过人的头骨将声音直接传递到内耳,不经过耳道,因此不会阻碍外界声音的进入,同时也能更好地保…

pytorch强化学习(1)——DQNSARSA

实验环境 python3.10 torch2.1.1 gym0.26.2 gym[classic_control] matplotlib3.8.0 numpy1.26.2DQN代码 首先是module.py代码,在这里定义了网络模型和DQN模型 import torch import torch.nn as nn import numpy as npclass Net(nn.Module):# 构造只有一个隐含层的…

【Python】计算最少排班人数(1)

需求背景: 某工作24小时需要人员,单个班次为8或9小时,需要根据每小时需要的人数、不同的班次计算最低需要的人数。 每小时需要的人数举例: 班次类型: 问题分析: 1、需要各个时段的人员数大于等于需要的人…

CV中的Attention机制:SENet

paper: Squeeze-and-Excitation Networks paper link:https://arxiv.org/pdf/1709.01507.pdf repo link:GitHub - hujie-frank/SENet: Squeeze-and-Excitation Networks 摘要: 卷积神经网络(CNNs)的核心构建块是卷积算子,它使…

微信小程序map视野发生改变时切换定位点

<!--地图--> <view><map id"myMap" style"width: 100%; height: 300px;" latitude"{{latitude}}" longitude"{{longitude}}"scale"{{scale}}" markers"{{markers}}" controls"{{controls}}&q…

OpenCV-Python:图像平滑操作

目录 图像平滑基础 本文目标 2D卷积 图像模糊&#xff08;图像平滑&#xff09; 平均模糊 高斯模糊 中值模糊 双边滤波 图像平滑基础 在尽量保留图像原有信息的情况下&#xff0c;过滤掉图像内部的噪声&#xff0c;这一过程称为对图像的平滑处理&#xff0c;所得的图像…

排序算法之三:希尔排序

希尔排序基本思想 希尔排序法又称缩小增量法 希尔排序法的基本思想是&#xff1a;先选定一个整数&#xff0c;把待排序文件中所有记录分成个组&#xff0c;所有距离为的记录分在同一组内&#xff0c;并对每一组内的记录进行排序。然后&#xff0c;取&#xff0c;重复上述分组…

ThingsBoard 前端项目轮播图部件开发

前言 ThingsBoard 是目前 Github 上最流行的开源物联网平台&#xff08;14.6k Star&#xff09;&#xff0c;可以实现物联网项目的快速开发、管理和扩展, 是中小微企业物联网平台的不二之选。 本文介绍如何在 ThingsBoard 前端项目中开发轮播图部件。 产品需求 最近接到产品…

C++并查集

1.并查集概念 1.1.并查集定义 在一些应用问题中&#xff0c;需要&#xff1a; 将 n 个不同的元素划分成一些不相交的集合开始时&#xff0c;每个元素自成成为一个集合然后按一定的规律&#xff0c;将归于同一组元素的集合合并期间需要反复用到查询某个元素归属于那个集合的算…

python利用requests库进行接口测试的方法详解

前言 之前介绍了接口测试中需要关注得测试点&#xff0c;现在我们来看看如何进行接口测试&#xff0c;现在接口测试工具有很多种&#xff0c;例如&#xff1a;postman,soapui,jemter等等&#xff0c;对于简单接口而言&#xff0c;或者我们只想调试一下&#xff0c;使用工具是非…

迈入数据结构殿堂——时间复杂度和空间复杂度

目录 一&#xff0c;算法效率 1.如何衡量一个算法的好坏&#xff1f; 2.算法效率 二&#xff0c;时间复杂度 1.时间复杂度的概念 2.大O的渐进表示法 3.推导大O的渐进表示法 4.常见时间复杂度举例 三&#xff0c;空间复杂度 一&#xff0c;算法效率 数据结构和算法是密…

【产品】Axure的基本使用(二)

文章目录 一、元件基本介绍1.1 概述1.2 元件操作1.3 热区的使用 二、表单型元件的使用2.1 文本框2.2 文本域2.3 下拉列表2.4 列表框2.5 单选按钮2.6 复选框2.7 菜单与表格元件的使用 三、实例3.1 登录2.2 个人简历 一、元件基本介绍 1.1 概述 在Axure RP中&#xff0c;元件是…

如何使用透明显示屏

透明显示屏的使用主要取决于具体的应用场景和需求。以下是一些常见的使用透明显示屏的方法&#xff1a; 商业展示&#xff1a;透明显示屏可以作为商品展示柜&#xff0c;通过高透明度、高分辨率的屏幕展示商品细节&#xff0c;吸引顾客的注意力。同时&#xff0c;透明显示屏还可…

人工智能基本常识:让深度学习技术更加人性化

近年来&#xff0c;人工智能技术日臻成熟。现在&#xff0c;许多产品和服务都依靠人工智能技术实现自动化和智能化&#xff0c;因此它与我们的日常生活息息相关。无论是为我们带来各种便利的家用设备&#xff0c;还是我们一直在使用的产品制造方式&#xff0c;人工智能的影响无…