前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

递归

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

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

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


递归求和

在接触递归之前,我们先来做这么一个问题:如果说,要对一个数字列表求和(或者其他序列)求和,除了我们可以使用内置的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 0else: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 sumfor var in L:if not isinstance(var,list):   #如果其中元素不为列表类型,则为一个确定的值sum += varelse:mysum(var)return

花钱递归

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

递归解决:

def cost(money,day=0):if money > 0:money = money // 2 #每次花一半day += 1 #花完天数+1cost(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 funcFile "<stdin>", line 2, in funcFile "<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 osdef getdir(path, level=0):if path == '':path = os.getcwd()  # 获取当前的工作目录level += 4num = level // 4abs_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 += namemystr = format_str.replace('_', ' ', level-4)  # 替换掉level-4个_else:for var in range(num): # range函数用来控制循环次数format_str += '_' * 4 + '▕' # 输出样式构造format_str += namemystr = 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递归及递归遍历目录相关推荐

  1. python os.walk遍历目录_python中os.walk()遍历目录中所有文件

    之前一直用判断目录和文件的递归方法来获取一个目录下的所有文件,后来发现python里面已经写好了这个函数,不需要自己递归获取了,记录下os.walk()函数的用法 目的:获取path下所有文件,返回由 ...

  2. python 递归遍历目录排序_python下递归遍历目录和文件

    方法一:递归调用: import os def dirlist(path, allfile): filelist =  os.listdir(path) for filename in filelis ...

  3. linux sed 目录递归,shell递归遍历目录下的所有文件并统一改名的方法-文件更名...

    对Linux开发技术感兴趣或者是从事Linux开发技术的小伙伴是否知道如何把某个目录下的每个文件统一在名字前加上"abc",用shell实现呢?下面就随Linux培训小编来了解一下 ...

  4. 后序遍历的非递归算法python_刷题系列 - Python用非递归实现二叉树后续遍历

    顺便把Python用非递归实现二叉树后续遍历也写了. 其实前序中序和后续都是针对父节点说的.比如下面这个最简单二叉树. 前序就是ABC,父节点A在前 中序就是BAC,父节点A在中间 后序就是BCA,父 ...

  5. 基于Java Socket的文件UpLoad代码(完美版)-用递归解决java的目录树遍历

    http://blog.csdn.net/dongfengsun/archive/2007/12/12/1930577.aspx 上次用J2SE写了一个文件夹传递工具,把所有文件都以字节流的形式写入到 ...

  6. java 递归 遍历目录下的所有文件

    public class Demo{static int level;public static void main(String[] args) throws IOException {//利用递归 ...

  7. 递归 遍历目录下的所有文件

    public class Demo{static int level;public static void main(String[] args) throws IOException {//利用递归 ...

  8. linux脚本遍历目录,shell脚本递归遍历目录及子目录的例子分享

    用shell写的递归遍历目录的脚本,脚本实现递归遍历指定目录,打印目录下的文件名. 实例1: 复制代码 代码如下: #!/bin/sh function scandir() { local cur_d ...

  9. dos递归遍历目录删log

    windows 版的 [1],递归删非空文件夹,同时打印目录树(不用 tree 命令) 函数定义.传参见 [4,5] :<函数名> 开始(其实是行号?),goto:eof 结束(其实只是 ...

最新文章

  1. 技术道路独行16载,他总结了CTO的五大自我修炼法则!
  2. 派生类的赋值运算符重载【C++继承】
  3. 日常生活小技巧 -- 重装win10系统
  4. 【学术相关】RSPapers | 工业界推荐系统论文合集
  5. step5 . day5 网络编程 基于UDP协议的多人网络在线聊天功能
  6. DataArtisans战略联手阿里云 Apache Flink服务能力云化
  7. java jsp导出pdf文件_JSP页面导出PDF格式文件
  8. ContentProvider简介
  9. 7.PL_SQL——在PL_SQL程序中内嵌查询语句、DML语句、事物处理语句和游标属性
  10. utf-8下编辑的时候字体不能直接识别,但是可以识别 unicode 编码表
  11. mac 安装 tunnelblick
  12. 深度学习之 RBF神经网络
  13. [每日一氵] Python 训练过程中,如何优雅的保存loss
  14. c语言创建一个bat文件内容,基础教程:如何创建批处理文件
  15. cursor游标讲解
  16. html制作钢铁侠心脏,钢铁侠的“心脏”并不是特效,得知如何制成的,网友:难以置信...
  17. Mysql安装后环境变量配置
  18. python四级是什么水平_英语四级相当于什么水平?
  19. Github仓库如何选择开源许可证
  20. 一文读懂SpringBoot定时任务

热门文章

  1. 存储过程分页——单表分页,任意表分页,EF调用分页存储过程
  2. 服务器5g网页空间是什么意思,虚拟主机5g空间够大吗
  3. validationEngine验证
  4. QT for Android环境配置犯病过程记录
  5. 新手学QT之书籍总结篇
  6. 高德地图自定义标记点marker缩放偏移问题
  7. 从零开始手把手教你使用javascript+canvas开发一个塔防游戏02敌人自动寻路
  8. 夫妻之间的情与理和哄与捧
  9. R语言中apply系列函数详解
  10. 2021-12-09 股票模拟交易心得6