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中黄金分割法实现方法
May 06 Python
Python对象转JSON字符串的方法
Apr 27 Python
浅谈用Python实现一个大数据搜索引擎
Nov 28 Python
Python实现图片尺寸缩放脚本
Mar 10 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
pygame实现贪吃蛇游戏(上)
Oct 29 Python
ansible动态Inventory主机清单配置遇到的坑
Jan 19 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
python 负数取模运算实例
Jun 03 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
python中常用的数据结构介绍
Jan 12 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 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简单提示框alert封装函数
2010/08/08 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
javascript 面向对象编程基础 多态
2009/08/21 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
javascript计时器事件使用详解
2014/01/07 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
再谈JavaScript线程
2015/07/10 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
详解JavaScript正则表达式之RegExp对象
2015/12/13 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
基于Python闭包及其作用域详解
2017/08/28 Python
Python实现图片拼接的代码
2018/07/02 Python
在Python中使用Neo4j的方法
2019/03/14 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
2019/08/30 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
《毛主席在花山》教学反思
2014/04/20 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
钳工实训报告总结
2014/11/04 职场文书
学雷锋日活动总结
2015/02/06 职场文书
运动会新闻报道稿
2015/07/22 职场文书
机械生产实习心得体会
2016/01/22 职场文书
创业计划书之o2o水果店
2019/08/30 职场文书