目录
递归
写递归方式:
模拟栈结构
队列
递归遍历目录
栈模拟递归遍历目录(深度遍历)
队列模拟递归(广度遍历)
递归
递归调用:一个函数,如果调用了自身,这种调用称为递归调用,一个会调用自身的函数称为递归函数
凡是循环能做的,递归都能做
写递归方式:
- 写出临界条件
- 找这一次和上一次的关系
- 假设当前函数已经能用,调用自身计算上一次的结果,再求出本次的结果
输入n,求1+2+3+......+n的值
方法1:
a = int(input("请输入一个数:"))
b = 0
def fun(a,b):
if a>0:
b += a
a = a-1
fun(a,b)
else:
print(b)
fun(a,b)
方法2:
相当于fun(1)+2 = fun(2)
fun(2) + 3 = fun(3)
fun(3) + 4 = fun(4)
fun(4) + 5 = fun(5)
a = int(input("请输入一个数:"))
def fun(a):
if(a==1):
return a
return a + fun(a-1)
print(fun(a))
模拟栈结构
先进后出
#模拟栈结构
stack = []
#压栈(向栈中存入数据)
stack.append('a')
stack.append('b')
stack.append('c')
print(stack)
#出栈(在栈里取数据)
res = stack.pop()
print(res)
print(stack)
res = stack.pop()
print(res)
print(stack)
队列
先进先出
import collections
#创建一个队列
queue = collections.deque()
print(queue)
#进队(数据存入队列)
queue.append('a')
queue.append('b')
queue.append('c')
print(queue)
#出队(在队列里取数据)
res = queue.popleft()
print(res)
print(queue)
res = queue.popleft()
print(res)
print(queue)
递归遍历目录
import os
#递归调用得到当前目录下所有文件
def get(path):
#得到当前目录下的文件列表
file = os.listdir(path)
#处理每一个文件
for name in file:
#判断文件是否是目录,要使用绝对路径
if os.path.isdir(os.path.join(path,name)):
print("目录:",name)
get(os.path.join(path,name))
else:
print("普通文件:",name)
get(r"F:\pycharm")
import os
#递归调用得到当前目录下所有文件
def get(path,sp):
#得到当前目录下的文件列表
file = os.listdir(path)
#处理每一个文件
sp += " "
for name in file:
#判断文件是否是目录,要使用绝对路径
if os.path.isdir(os.path.join(path,name)):
print(sp+"目录:",name)
get(os.path.join(path,name),sp)
else:
print(sp+"普通文件:",name)
get(r"F:\pycharm","")
栈模拟递归遍历目录(深度遍历)
深度优先遍历(Depth-First Traversal)
假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。
图的深度优先遍历类似于树的前序遍历。采用的搜索方法的特点是尽可能先对纵深方向进行搜索。这种搜索方法称为深度优先搜索(Depth-First Search)。相应地,用此方法遍历图就很自然地称之为图的深度优先遍历。
设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y)。若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。上述过程直至从x出发的所有边都已检测过为止。此时,若x不是源点,则回溯到在x之前被访问过的顶点;否则图中所有和源点有路径相通的顶点(即从源点可达的所有顶点)都已被访问过,若图G是连通图,则遍历过程结束,否则继续选择一个尚未被访问的顶点作为新的顶点,继续遍历。
import os
def get(path):
stack = []
stack.append(path)
#处理栈,当栈为空时结束循环
while len(stack) != 0:
#从栈里取出数据
dirpath = stack.pop()
#目录下所有文件
dirlist = os.listdir(dirpath)
#print(dirlist)
#处理每一个文件,如果是普通文件打印出来,如果是目录,则将该目录地址再压栈
for filename in dirlist:
filepath = os.path.join(dirpath,filename)
if os.path.isdir(filepath):
#是目录,压栈
print("目录:",filename)
stack.append(filepath)
else:
#不是目录,打印
print("普通文件:",filename)
get(r"F:\pycharm")
队列模拟递归(广度遍历)
import os
import collections
def get(path):
queue = collections.deque()
#进队
queue.append(path)
while len(queue) != 0:
#出队数据
dirpath = queue.popleft()
#找出所有的文件
filelist = os.listdir(dirpath)
for filename in filelist:
#绝对路径
filepath = os.path.join(dirpath, filename)
if os.path.isdir(filepath):
# 是目录,压栈
print("目录:", filename)
queue.append(filepath)
else:
# 不是目录,打印
print("普通文件:", filename)
get(r"F:\pycharm")
一起学习,一起进步 -.- ,如有错误,可以发评论