目录

 

递归

写递归方式:

模拟栈结构

队列

递归遍历目录

栈模拟递归遍历目录(深度遍历)

队列模拟递归(广度遍历)


递归

递归调用:一个函数,如果调用了自身,这种调用称为递归调用,一个会调用自身的函数称为递归函数

凡是循环能做的,递归都能做

 

写递归方式:

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

输入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))

 

模拟栈结构

先进后出

python 循环递归return python递归和循环_python 循环递归return

#模拟栈结构
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)

python 循环递归return python递归和循环_深度优先遍历_02

 

队列

先进先出

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)

python 循环递归return python递归和循环_递归_03

递归遍历目录

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")

python 循环递归return python递归和循环_python 循环递归return_04

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","")

python 循环递归return python递归和循环_深度优先遍历_05

 

栈模拟递归遍历目录(深度遍历)

深度优先遍历(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是连通图,则遍历过程结束,否则继续选择一个尚未被访问的顶点作为新的顶点,继续遍历。

python 循环递归return python递归和循环_深度优先遍历_06

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")

python 循环递归return python递归和循环_python_07

 

队列模拟递归(广度遍历)

python 循环递归return python递归和循环_python_08

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")

python 循环递归return python递归和循环_搜索_09

 

 

一起学习,一起进步 -.- ,如有错误,可以发评论