Python中递归以及递归遍历目录详解


Posted in Python onOctober 24, 2021

递归

递归的概念:函数包含了对自身的调用,那么就是递归

使用的场景:如果你发现你将要做的事情就是你现在做的,那么用递归

递归类似循环;在编写或阅读递归时,首先我们关注的是递归的终止条件

递归求和

在接触递归之前,我们先来做这么一个问题:如果说,要对一个数字列表求和(或者其他序列)求和,除了我们可以使用内置的sum函数,还有什么办法?

while循环

L = [1,2,3,4,5]
mysum = 0 #保存和的变量
while L: #将列表最为循环条件
	mysum += L[0] #每次将列表第一个位置的值加到和中
	L = L[1:] #去掉列表第一个元素

for循环

L = [1,2,3,4,5]
mysum = 0
for var in L:
	mysum += var

递归求和

def mysum(L):
    if not L:
        print ('L is empty')
        return 0
    else:
      	return L[0]+mysum(L[1:])
# 在返回值中,我们返回了一个函数的调用,并且传递的参数为去掉当前列表第一个元素的新列表

递归处理非线性循环

递归还可以处理一些非线性循环,而普通的循环是无法处理的;比如这样一个列表对其求和:

L = [1,[2,[3,4],5],6,[7,8]]

由于这个列表不是一个线性迭代,包含着复杂的元素嵌套,普通的循环语句处理起来将会非常难以控制

L = [1,[2,[3,4],5],6,[7,8]]
sum = 0
def mysum(L):
    global sum
    for var in L:
    	if not isinstance(var,list):   
            #如果其中元素不为列表类型,则为一个确定的值
            sum += var
        else:
         	mysum(var)
    return

花钱递归

思考:假如你有10000块,每天花一半,毛钱直接舍弃,那么这钱可以花几天?

递归解决:

def cost(money,day=0):
    if money > 0:
        money = money // 2 #每次花一半
        day += 1 #花完天数+1
        cost(money,day) #开启花钱递归
    else:
        print('一共可以花%d天' % day)
        return #必须要有的一个终止条件

递归注意事项

Python中,递归的最大上限次数差不多是998次,一个没有终止条件的递归会引发错误(类似一个死循环)

这是因为递归的每一次函数执行,都会在内存中产生新的函数副本,递归的内存消耗要大于普通循环

>>> def func():
...     return func()
...
>>> func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in func
  File "<stdin>", line 2, in func
  File "<stdin>", line 2, in func
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
#这里我们在995次递归之后,达到上线,从而报错

我们也可以手动干预递归的上限,但是这是有风险的,要结合计算机本身内存来考虑

>>> import sys
>>> sys.setrecursionlimit(num)
# num为控制修改的最大递归上限次数

实现Tree命令

核心思路在于,目录结构的深度及广度是错综复杂的,通过单纯的循环来做判定是一件非常苦难的事情

而递归恰好适合这样的非线性循环问题,当然也有一些弊端,当目录结构越来越复杂,那么程序的执行效率会越来越差

import os

def getdir(path, level=0):
    if path == '':
      	path = os.getcwd()  # 获取当前的工作目录
    level += 4
    num = level // 4
    abs_path = os.path.abspath(path)
    for name in os.listdir(path):  # 返回的是一个列表
        format_str = ''
        if os.path.isfile(os.path.join(abs_path, name)):
            for var in range(num):  # range函数用来控制循环次数
              	format_str += '_' * 4 + '?'
            format_str = format_str[0:-1]
            format_str += name
            mystr = format_str.replace('_', ' ', level-4)  # 替换掉level-4个_
    else:
        for var in range(num): # range函数用来控制循环次数
            format_str += '_' * 4 + '?' # 输出样式构造
        format_str += name
        mystr = format_str.replace('_',' ',level-4) # 替换掉level-4个_
    print(mystr) # 输出格式字符串
    name = os.path.join(abs_path,name)
    if os.path.isdir(name): # 绝对路径,判断是否是文件夹
	    getdir(name,level)
path = input('请输入你要遍历的目录:')
getdir(path)

总结

到此这篇关于Python中递归以及递归遍历目录的文章就介绍到这了,更多相关Python递归遍历目录内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python下如何让web元素的生成更简单的分析
Jul 17 Python
Python随机生成彩票号码的方法
Mar 05 Python
Python3.x版本中新的字符串格式化方法
Apr 24 Python
python实现下载整个ftp目录的方法
Jan 17 Python
Python读写及备份oracle数据库操作示例
May 17 Python
django表单实现下拉框的示例讲解
May 29 Python
Python requests模块实例用法
Feb 11 Python
Django 路由控制的实现
Jul 17 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
Python+Redis实现布隆过滤器
Dec 08 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
python实现FTP文件传输的方法(服务器端和客户端)
Mar 20 Python
python基础之函数的定义和调用
python 标准库原理与用法详解之os.path篇
Oct 24 #Python
Python干货实战之八音符酱小游戏全过程详解
关于python pygame游戏进行声音添加的技巧
Oct 24 #Python
python实现简单石头剪刀布游戏
Python 数据结构之十大经典排序算法一文通关
Python 的 sum() Pythonic 的求和方法详细
Oct 16 #Python
You might like
坏狼php学习 计数器实例代码
2008/06/15 PHP
PHP 反射机制实现动态代理的代码
2008/10/22 PHP
php 模拟POST提交的2种方法详解
2013/06/17 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
jQuery 获取兄弟元素的几种不错方法
2014/05/23 Javascript
JavaScript的ExtJS框架中表格的编写教程
2016/05/21 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
jQuery实现简单的回到顶部totop功能示例
2017/10/16 jQuery
js实现页面多个日期时间倒计时效果
2019/06/20 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
JavaScript实现动态留言板
2020/03/16 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
简单解决Python文件中文编码问题
2015/11/22 Python
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
RetroStage德国:复古服装
2019/02/03 全球购物
英国电子专家:maplin
2019/09/04 全球购物
2014超市双十一活动策划方案
2014/09/29 职场文书
党员自我剖析材料范文
2014/10/06 职场文书
给老婆的保证书
2015/01/16 职场文书