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实现公历(阳历)转农历(阴历)的方法示例
Aug 22 Python
python自动发送邮件脚本
Jun 20 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
python开启摄像头以及深度学习实现目标检测方法
Aug 03 Python
对Python信号处理模块signal详解
Jan 09 Python
Python中字符串与编码示例代码
May 20 Python
Python中新式类与经典类的区别详析
Jul 10 Python
在Django下测试与调试REST API的方法详解
Aug 29 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
python实现图像拼接功能
Mar 23 Python
详解python安装matplotlib库三种失败情况
Jul 28 Python
python 实现德洛内三角剖分的操作
Apr 22 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
php-redis中的sort排序函数总结
2015/07/08 PHP
php错误日志简单配置方法
2016/07/11 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
jQuery提交多个表单的小例子
2013/06/30 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
利用css+原生js制作简单的钟表
2020/04/07 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
[44:01]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS paiN
2018/03/31 DOTA
使用pycharm生成代码模板的实例
2018/05/23 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
Python 给下载文件显示进度条和下载时间的实现
2020/04/02 Python
使用Pycharm分段执行代码
2020/04/15 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
50个强大璀璨的CSS3/JS技术运用实例
2010/02/27 HTML / CSS
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
致跳远、跳高运动员广播稿
2014/01/09 职场文书
旅游专业职业生涯规划范文
2014/01/13 职场文书
农民工创业典型事迹
2014/01/25 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
Python预测分词的实现
2021/06/18 Python
JS高级程序设计之class继承重点详解
2022/07/07 Javascript