Python进阶学习(10)—递归(阶乘,文件系统以及二分查找的递归函数)

1 如何理解“递归”

递归是一种应用非常广泛的算法(或者编程技巧),通过一个函数在执行过程中一次或多次调用其本身,或者通过一种数据结构在其表示中依赖于相同的类型的结构或者更小的实例。之后我们要讲的很多数据结构和算法的编码实现都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。所以,搞懂递归非常重要,否则,后面复杂一些的数据结构和算法学起来就会比较吃力。

2 递归需要满足的三个条件

1 一个问题的解可以分解为几个子问题的解
2 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
3 存在递归终止条件

3 说明性的例子

1 实现一个数的阶乘

def factorial(n):
    if n == 1:
        return 1
    return n*factorial(n-1)

这个函数没有任何显式循环
我们使用递归跟踪的形式来说明一下factorial(4)的执行过程。
在这里插入图片描述
每当一个函数被调用时,都会创建一个被称为活动记录或框架的结构来储存信息,这个活动记录包含一个用来存储函数调用的参数以及局部变量的命名空间

2 计算一个文件系统磁盘使用情况的递归函数

先讲一下即时磁盘空间以及累计磁盘空间
比如有一个文件夹(或文件),它本身占一定的空间,就是即时磁盘空间,此文件夹里面的视频,图片等其他文件或文件夹所有的磁盘空间总和为累计磁盘空间。

import os
def disk_usage(path):
	# 得到目录的即时磁盘空间
    total = os.path.getsize(path)  
     # 递归的结束条件,当传入的路径指定的是一个文件夹时执行,也就是遍历完文件夹里所有的文件夹。直到没有下一级
    if os.path.isdir(path):  
    	# 依次遍历目录下的所有新目录
        for filename in os.listdir(path):  # 生成新目录的路径字符串
            childpath = os.path.join(path,filename)   
            total += disk_usage(childpath)   # 递归
    print(total,path)
    return total

先创建一个ddd的文件
在这里插入图片描述
文件ddd里面创建两个目录
在这里插入图片描述
aaa里面写入bbb txt 文件,eee里面创建fff txt 文件
在这里插入图片描述
执行下面代码

file_path = r'D:\ddd'
print(disk_usage(file_path))

运行结果为

5 D:\ddd\aaa\bbb.txt
5 D:\ddd\aaa
5 D:\ddd\eee\fff.txt
5 D:\ddd\eee
10 D:\ddd
10

3 二分查找
二分查找用于在一个有序的序列中寻找特定的元素,
其原理用伪代码表示,data 表示有序序列,target 表示要查找的元素,mid表示中间元素的索引
伪代码

def binary_search(data,target):
	mid = 序列data除以2(取整)
	如果 target 等于 data[mid]:
		return Ture
	如果 target 小于 data[mid]:
		对小于data[mid]的数进行二分法
	如果 target 大于 data[mid]:
		对大于data[mid]的数进行二分法
		

代码实现

def binary_search(data,target):
    if len(data) <= 0:
        return False
    mid = len(data) // 2
    if target == data[mid]:
        return True
    if target < data[mid]:
        return binary_search(data[:mid -1],target)
    elif target > data[mid]:
        return binary_search(data[mid + 1:],target)

由于二分查找不用遍历序列,都是一半一半进行查找,所以时间复杂度为O(logn)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值