python学习笔记16(递归、栈和队列)

递归、栈和队列

递归调用: 一个函数,调用了自身,称为递归调用
递归函数: 一个会调用自身的函数称为递归函数
特点: 凡是循环能干的事,递归都能干

过程:
1、写出临界条件
2、找这一次和上一次的关系
3、假设当前函数已经能用,调用自身计算上一次的结果,再求出本次的结果

#输入一个数(大于等于1),求1+2+3+……+n的和
#用for循环
def sum1(n):
    sum = 0
    for x in range(1, n + 1):
        sum += x
    return sum
res = sum1(res)
print("res =", res)

#用递归
def sum2(n):
    if n == 1:
        return 1
    else:
        return n + sum2(n - 1)#sum2中执行sum2
res = sum2(5)
print("res =", res)
#输出:res = 15 


定义:一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素
特点:先入后出

#模拟栈结构
stack = []

#压栈(向栈里存数据)
stack.append("A")
print(stack)
stack.append("B")
print(stack)
stack.append("C")
print(stack)

#出栈(在栈里取数据)
res1 = stack.pop()
print("res1 =", res1)
print(stack)
res2 = stack.pop()
print("res2 =", res2)
print(stack)
res3 = stack.pop()
print("res3 =", res3)
print(stack)

队列
定义: 一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾进行删除操作的端称为队头
特点:先入先出

import collections

#创建一个队列
queue = collections.deque()
print(queue)

#进队(存数据)
queue.append("A")
print(queue)
queue.append("B")
print(queue)
queue.append("C")
print(queue)

#出队(取数据)
res1 = queue.popleft()
print("res1 =", res1)
print(queue)
res2 = queue.popleft()
print("res2 =", res2)
print(queue)
res3 = queue.popleft()
print("res3 =", res3)
print(queue)

递归遍历目录

#给定一个目录,打印所有该目下的子目录以及文件,包括子目录下面的子目录
import os

def getAllDir(path, sp = ""):
    #得到当前目录下所有的文件
    filesList = os.listdir(path)
    #处理每一个文件
    sp += "   "  #产生缩进
    for fileName in filesList:
        #恢复成绝对路径名
        fileAbsPath = os.path.join(path, fileName)
        if os.path.isdir(fileAbsPath):      #判断是否是路径(用绝对路径)
            print(sp + "目录:", fileName)
            #递归调用
            getAllDir(fileAbsPath, sp)     #挖掘该目录下的子目录
        else:
            print(sp + "普通文件:", fileName)

getAllDirRE(r"C:\Users\xgg\Desktop\temp\dir")

利用栈遍历目录

import os
def getAllDirDE(path):
    stack = []
    stack.append(path)     #讲要目标目录压栈

    #处理栈,当栈为空的时候结束循环
    while len(stack) != 0:
        #从栈里取出并删除数据
        dirPath = stack.pop()
        #得到目录下所有文件
        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"C:\Users\xgg\Desktop\temp\dir")

利用队列遍历目录

import os
import collections

def getAllDirQU(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)
getAllDirQU(r"C:\Users\xgg\Desktop\temp\dir")

猜你喜欢

转载自blog.csdn.net/weixin_42216171/article/details/85784017