一. 递归
递归调用:一个函数,调用了自身,称为递归调用
递归函数:一个会调用自身的函数称为递归函数
凡是循环能干的事,均可以用递归写出来
方式:
- 写出临界条件
- 找这一次和上一次的关系
- 假设当前函数已经能用,调用自身计算上一次的结果,再求出本次结果
思路:
- 临界条件(1)
- 找上一次和本次的关系(相加的关系)
- sum(4)+5 = sum(5),所以return n + sum(n - 1)
#输入一个数(大于等于1),求1+2+3……n的和
def sum(n):
if n == 1:
return 1
else:
return n + sum(n - 1)
s = sum(3)
print(s)
二. 栈与队列
栈:先进后出
#模拟栈结构
stack = []
#压栈(向栈里存数据)
stack.append("A")
print(stack)
stack.append("B")
print(stack)
#出栈(在栈里取数据)
res = stack.pop()
print("res = ", res)
print(stack)
队列:先进先出
import collections
#创建一个队列
queue = collections.deque()
print(queue)
#进队(存数据)
queue.append("A")
print(queue)
queue.append("B")
print(queue)
#出队(取数据)
res1 = queue.popleft()
print("res1 =", res1)
print(queue)
res2 = queue.popleft()
print("res2 =", res2)
print(queue)
三. 目录遍历
- 3.1递归目录遍历
import os
def getAllDir(path):
#得到当前目录下所有的文件
filesList = os.listdir(path)
#处理每一个文件
for fileName in filesList:
#判断是否是路径(用绝对路径)
fileAbsPath = os.path.join(path, fileName)
if os.path.isdir(fileAbsPath):
print("目录:",fileName)
getAllDir(fileAbsPath)
else:
print("普通文件:",fileName)
#if os.path.isdir(os.path.join(path, fileName)):
#print("目录:", fileName)
#else:
#print("普通文件", fileName)
getAllDir("D:\杂物")
- 3.2 栈模拟递归遍历目录(深度遍历)
import os
#深度遍历
def getAllDirDE(path):
stack = [] #定义栈
stack.append(path) #压栈
#处理栈,当栈为空的时候结束循环
while len(stack) != 0:
#从栈里取出数据
dirPath = stack.pop()
#以列表的形式把指定目录下的所有的文件存入filesList
filesList = os.listdir(dirPath)
#处理每一个文件,如果是普通文件则打印出来,
#如果是目录,则将该目录的地址压栈
for fileName in filesList:
fileAbsPath = os.path.join(dirPath,fileName)
if os.path.isdir(fileAbsPath):
#是目录就压栈
print("目录:" + fileName)
stack.append(fileAbsPath)
else:
#打印普通文件
print("普通:"+fileName)
getAllDirDE(r"D:\植物")
3.3 队列模拟递归遍历目录(广度遍历)
import os
import collections
def getAllDirDU(path):
queue = collections.deque()
#进队
queue.append(path)
while len(queue) != 0:
#出队数据
dirPath = queue.popleft()
#找出所有文件
filesList = os.listdir(dirPath)
for fileName in filesList:
fileAbsPath = os.path.join(dirPath, fileName)
if os.path.isdir(fileAbsPath):
print("目录:"+fileName)
queue.append(fileAbsPath)
else:
print("普通文件:"+fileName)
getAllDirDU(r"D:\植物")