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的Django框架中的通用视图
May 04 Python
Python中用max()方法求最大值的介绍
May 15 Python
Python的Django框架中TEMPLATES项的设置教程
May 29 Python
Python的GUI框架PySide的安装配置教程
Feb 16 Python
python3使用pandas获取股票数据的方法
Dec 22 Python
python调用虹软2.0第三版的具体使用
Feb 22 Python
Django缓存系统实现过程解析
Aug 02 Python
python KNN算法实现鸢尾花数据集分类
Oct 24 Python
matplotlib绘制多个子图(subplot)的方法
Dec 03 Python
python动态文本进度条的实例代码
Jan 22 Python
基于django micro搭建网站实现加水印功能
May 22 Python
Pytorch转onnx、torchscript方式
May 25 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函数
2010/02/16 PHP
php抓取页面与代码解析 推荐
2010/07/23 PHP
php实现水仙花数的4个示例分享
2014/04/08 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
JavaScript作用域链示例分享
2014/05/27 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
javascript实现rgb颜色转换成16进制格式
2015/07/10 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
浅谈js中的this问题
2017/08/31 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
Vue-cli3项目配置Vue.config.js实战记录
2018/07/29 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
vue绑定class的三种方法
2020/12/24 Vue.js
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
[02:10]DOTA2 TI10勇士令状玩法及不朽Ⅰ展示:焕新世界,如你所期
2020/05/29 DOTA
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
销售人员自我评价
2014/02/01 职场文书
总结表彰大会主持词
2014/03/26 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
标准单位租车协议书
2014/09/23 职场文书
士兵突击观后感
2015/06/16 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
社区干部培训心得体会
2016/01/06 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python