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 28 Python
Python中扩展包的安装方法详解
Jun 14 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 Python
django2笔记之路由path语法的实现
Jul 17 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
python tornado使用流生成图片的例子
Nov 18 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
Jan 08 Python
tensorflow使用指定gpu的方法
Feb 04 Python
jupyter notebook 增加kernel教程
Apr 10 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
Apr 14 Python
Python连接mysql方法及常用参数
Sep 01 Python
python中四舍五入的正确打开方式
Jan 18 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用正则表达式匹配中文实例详解
2013/11/06 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
php常用hash加密函数
2014/11/22 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
linux 下以二进制的方式安装 nodejs
2020/02/12 NodeJs
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
python使用Tkinter显示网络图片的方法
2015/04/24 Python
python中实现字符串翻转的方法
2018/07/11 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
通用C#笔试题附答案
2016/11/26 面试题
毕业生优秀推荐信
2013/11/26 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
Pytest中conftest.py的用法
2021/06/27 Python
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL