python 递归深度优先搜索与广度优先搜索算法模拟实现


Posted in Python onOctober 22, 2018

python 递归深度优先搜索与广度优先搜索算法模拟实现

 一、递归原理小案例分析

(1)# 概述

递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到!

(2)# 写递归的过程

1、写出临界条件

2、找出这一次和上一次关系

3、假设当前函数已经能用,调用自身计算上一次的结果,再求出本次的结果

(3)案例分析:求1+2+3+...+n的数和

# 概述
'''
递归:即一个函数调用了自身,即实现了递归
凡是循环能做到的事,递归一般都能做到!
'''
# 写递归的过程
'''
1、写出临界条件
2、找出这一次和上一次关系
3、假设当前函数已经能用,调用自身计算上一次的结果,再求出本次的结果
'''
# 问题:输入一个大于1 的数,求1+2+3+....
def sum(n):
 if n==1:
  return 1
 else:
  return n+sum(n-1)
n=input("请输入:")
print("输出的和是:",sum(int(n)))
'''
输出:
请输入:4
输出的和是: 10
'''

python 递归深度优先搜索与广度优先搜索算法模拟实现

#__author:"吉*佳"
#date: 2018/10/21 0021
#function:
import os
def getAllDir(path):
 fileList = os.listdir(path)
 print(fileList)
 for fileName in fileList:
  fileAbsPath = os.path.join(path,fileName)
  if os.path.isdir(fileAbsPath):
   print("$$目录$$:",fileName)
   getAllDir(fileAbsPath)
  else:
   print("**普通文件!**",fileName)
 # print(fileList)
 pass
getAllDir("G:\\")

输出结果如下:

python 递归深度优先搜索与广度优先搜索算法模拟实现

python 递归深度优先搜索与广度优先搜索算法模拟实现

 二、深度遍历与广度遍历

(一)、深度优先搜索

说明:深度优先搜索借助栈结构来进行模拟

深度遍历示意图:

python 递归深度优先搜索与广度优先搜索算法模拟实现

说明:

先把A压栈进去,在A出栈的同时把B C压栈进去,此时让B出栈的同时把DE压栈(C留着先不处理) 同理,在D出栈的时候,H I压栈,最后再从上往下

取出栈内还未出栈的元素,即达到深度优先遍历。

案例实践:利用栈来深度搜索打印出目录结构

python 递归深度优先搜索与广度优先搜索算法模拟实现

程序代码:

#__author:"吉**"
#date: 2018/10/21 0021
#function:
# 深度优先遍历目录层级结构
import os
def getAllDirDP(path):
 stack = []
 # 压栈操作,相当于图中的A压入
 stack.append(path)
 # 处理栈,当栈为空的时候结束循环
 while len(stack) != 0:
  #从栈里取数据,相当于取出A,取出A的同时把BC压入
  dirPath = stack.pop()
  firstList = os.listdir(dirPath)
  #判断:是目录压栈,把该目录地址压栈,不是目录即是普通文件,打印
  for filename in firstList:
   fileAbsPath=os.path.join(dirPath,filename)
   if os.path.isdir(fileAbsPath):
    #是目录就压栈
    print("目录:",filename)
    stack.append(fileAbsPath)
   else:
    #是普通文件就打印即可,不压栈
    print("普通文件:",filename)
getAllDirDP(r'E:\[AAA](千)全栈学习python\18-10-21\day7\temp\dir')

结果:

python 递归深度优先搜索与广度优先搜索算法模拟实现

该过程示意图解释:(s-05-1部分)

python 递归深度优先搜索与广度优先搜索算法模拟实现

python 递归深度优先搜索与广度优先搜索算法模拟实现

原理分析:

python 递归深度优先搜索与广度优先搜索算法模拟实现

说明:

       队列是 先进先出的模型。A先进队,在A出队的时候,C B入队,按图示,C出队,FG 入队,B出队,DE入队,

F出队,JK入队,G出队,无入队,D出队,H I入队,最后E J K H I出队,均无入队了,即每一层一层处理、

故:先进先出的队列结构实现了广度优先遍历。 先进后出的栈结构实现的是深度优先遍历。

代码实现:

其实深度优先和广度优先在代码书写上是差别不大的,基本相同,只是一个是使用栈结构(用列表进行模拟)

另一个(广度优先遍历)是使用了队列的数据结构来达到先进先出的目的。

#__author:"吉**"
#date: 2018/10/21 0021
#function:
# 广度优先搜索模拟
# 利用队列来模拟广度优先搜索
import os
import collections
def getAllDirIT(path):
 queue=collections.deque()
 #进队
 queue.append(path)
 #循环,当队列为空,停止循环
 while len(queue) != 0:
  #出队数据 这里相当于找到A元素的绝对路径
  dirPath = queue.popleft()
  # 找出跟目录下的所有的子目录信息,或者是跟目录下的文件信息
  dirList = os.listdir(dirPath)
  #遍历该文件夹下的其他信息
  for filename in dirList:
   #绝对路径
   dirAbsPath = os.path.join(dirPath,filename)
   # 判断:如果是目录dir入队操作,如果不是dir打印出即可
   if os.path.isdir(dirAbsPath):
    print("目录:"+filename)
    queue.append(dirAbsPath)
   else:
    print("普通文件:"+filename)
# 函数的调用
getAllDirIT(r'E:\[AAA](千)全栈学习python\18-10-21\day7\temp\dir')

广度优先运行输出结构:

python 递归深度优先搜索与广度优先搜索算法模拟实现

先图解:按照每一层从左到右遍历即可实现。

python 递归深度优先搜索与广度优先搜索算法模拟实现

总结

以上所述是小编给大家介绍的python 递归深度优先搜索与广度优先搜索算法模拟实现 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python实现的Excel文件读写类
Jul 30 Python
python实现画五角星和螺旋线的示例
Jan 20 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
Python PIL图片添加字体的例子
Aug 22 Python
利用Python小工具实现3秒钟将视频转换为音频
Oct 29 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
Mar 30 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
Apr 26 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
python读取excel进行遍历/xlrd模块操作
Jul 12 Python
在Python中实现字典反转案例
Dec 05 Python
Python清空文件并替换内容的实例
Oct 22 #Python
Python过滤txt文件内重复内容的方法
Oct 21 #Python
python对html过滤处理的方法
Oct 21 #Python
一看就懂得Python的math模块
Oct 21 #Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 #Python
Python用5行代码写一个自定义简单二维码
Oct 21 #Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
Oct 21 #Python
You might like
如何将一个表单同时提交到两个地方处理
2006/10/09 PHP
php中判断字符串是否全是中文或含有中文的实现代码
2011/09/16 PHP
PHP的password_hash()使用实例
2014/03/17 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
Bootstrap3学习笔记(二)之排版
2016/05/20 Javascript
Angular 4.X开发实践中的踩坑小结
2017/07/04 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
2018/08/30 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
在Python中实现替换字符串中的子串的示例
2018/10/31 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
使用python实现飞机大战游戏
2020/03/23 Python
python实现斗地主分牌洗牌
2020/06/22 Python
python打包生成so文件的实现
2020/10/30 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
大学生学习生活的自我评价
2013/11/01 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
党员检讨书范文
2014/12/27 职场文书
后进生评语大全
2015/01/04 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
红白喜事主持词
2015/07/06 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
Python机器学习之基础概述
2021/05/19 Python
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python
HTTP中的Content-type详解
2022/01/18 HTML / CSS