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之从if开始语句的征程
Sep 14 Python
Python3编码问题 Unicode utf-8 bytes互转方法
Oct 26 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
django项目用higcharts统计最近七天文章点击量
Aug 17 Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
Jan 13 Python
Python pandas 列转行操作详解(类似hive中explode方法)
May 18 Python
Python实现寻找回文数字过程解析
Jun 09 Python
python 删除excel表格重复行,数据预处理操作
Jul 06 Python
scrapy结合selenium解析动态页面的实现
Sep 28 Python
Python将list元素转存为CSV文件的实现
Nov 16 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生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
基于php在各种web服务器的运行模式详解
2013/06/03 PHP
destoon官方标签大全
2014/06/20 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
如何实现JS函数的重载
2006/09/22 Javascript
阻止子元素继承父元素事件具体思路及实现
2013/05/02 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
JavaScript中的条件判断语句使用详解
2015/06/03 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python 正则表达式入门(中级篇)
2016/12/07 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
python生成特定分布数的实例
2019/12/05 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
创文明城市标语
2014/06/16 职场文书
结婚典礼主持词
2015/06/29 职场文书
运动会通讯稿600字
2015/07/20 职场文书
谢师宴家长答谢词
2015/09/30 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书