1. 理解算法前提

1.1 理解递归

递归:recursion

简单来说就是引用(或者调用)自身的意思。用递归实现的功能都可以用循环实现,但是有些时候递归函数更易读

# 通过循环实现幂函数
def power(x, n):result = 1for i in range(n):result *= xreturn result# 通过递归实现幂函数
def power(x, n):if n == 0:return 1else:# 注意此时调用power函数时的输入:x, n-1# 如果是输入: x, n 该函数将会陷入无限循环, 直到运行崩溃return x * power(x, n-1)

递归函数一定要以一个最小可能性问题结束,上述代码中的最小可能性问题就是:n == 0

1.2 Python生成器

关键字:yield

任何包含yield语句的函数称为生成器

生成器的行为和普通函数有很大的区别,它不像return那样返回值,而是每次产生多个值。每次产生一个值(使用yield语句),函数就会被冻结:即函数停在那点等待被重新唤醒。函数被重新唤醒后就从停止的那点开始执行。

# 定义一个递归生成器
# 问题描述:按从左到右的顺序取出序列中的每个元素,不论该序列内部嵌套了多少层序列
# 此处忽略输入为字符串的序列,我们测试的时候用列表
def flatten(nested):try:for sublist in nested:for element in flatten(sublist):yield elementexcept:yield nested# 调用该生成器
list(flatten([[[1],2],3,4,[5,[6,7]],8]))# 测试一下返回的到底是啥
g = flatten([[[1],2],3,4,[5,[6,7]],8])
print(g)
while(True):try:print(next(g))except:break

通过上述演示,我们可以看到生成器调用结束后返回了一个生成器对象,通过next函数可以逐个获取生成器内的每个返回值

如果上述递归生成器改成普通函数,则需要一个额外的序列去存储每次生成的element

2. 八皇后算法

2.1 八皇后问题描述

在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法

2.2 算法核心

2.2.1 检测冲突

def conflict(state, nextX):'''检测冲突, 逻辑如下state = (y1, y2, y3, ...)第一个皇后的位置: (0,y1)第二个皇后的位置: (1,y2)第三个皇后的位置: (2,y3)依此类推nextX 是下一个皇后的位置的x坐标, 从0开始'''# nextY 是下一个皇后的位置的y坐标, 从0开始, 于是: nextY = len(state)nextY = len(state)# 循环已知的皇后for i in range(nextY):# state[i] 是前面的皇后的位置的x坐标, i=0表示第一个皇后, i=1表示第二个皇后, 依次类推# 下一个皇后和前面任意一个皇后的位置的x坐标不能相同(同列), x坐标距离和y坐标距离不能相等(同斜线)if abs(nextX - state[i]) in (0, nextY - i):return Truereturn False

2.2.2 基于Python生成器求解

def queens(num=8, state=()):# 从第一列判断到第num-1列for pos in range(num):# 不冲突if not conflict(state, pos):# 已经是最后一个皇后了if len(state) == num-1:# 返回此皇后的位置yield (pos,)else:# 递归获取下一个皇后的位置, 输入为:下一行列数, 前面皇后的位置信息for result in queens(num, state + (pos,)):# 返回此皇后的位置 + 后面几个皇后的位置, 因为是递归, 所以是此皇后的放前面yield (pos,) + result

2.2.3 输出结果并图形化输出摆法

def prettyprint(solution):def line(pos, length=len(solution)):print((' - ' * pos) + ' x ' + (' - ' * (length - pos - 1)))print(solution)for pos in solution:line(pos)# 输出摆法
print(len(list(queens(4))))# 优化输出结果
for solution in queens(4):prettyprint(solution)

Congratulations

恭喜你学习到了第一个用Python实现的经典回溯算法——八皇后问题,更多进阶内容请继续关注,感兴趣记得订阅哦!!!

Python进阶之八皇后算法相关推荐

  1. python数据结构推荐书-「算法与数据结构」从入门到进阶吐血整理推荐书单

    推荐一下「算法与数据结构」从入门到进阶的书单. 一.入门系列 这些书籍通过图片.打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现, ...

  2. python进阶12并发之八多线程与数据同步

    原创博客地址:python进阶12并发之八多线程与数据同步 python并发首选进程,但偶尔有场景进程无法搞定,比如有些变量是无法序列化的,就无法使用工具包manager()的工具类进行共享.如果自己 ...

  3. Python 进阶之路 (九) 再立Flag, 社区最全的itertools深度解析(上)

    前言 大家好,今天想和大家分享一下我的itertools学习体验及心得,itertools是一个Python的自带库,内含多种非常实用的方法,我简单学习了一下,发现可以大大提升工作效率,在sf社区内没 ...

  4. 【Python进阶】Python进阶专栏栏主自述:不忘初心,砥砺前行

    转眼间加入有三AI快半年了,今天给大家来个自我介绍,分享下这一路来的历程与未来的规划. 作者 | 汤兴旺 编辑 | 汤兴旺 不忘初心 不知道为啥,从小自己对IT有着莫名的兴趣,但由于自己的近视度数太高 ...

  5. 【Python进阶】Python进阶专栏、编程与开源框架知识星球上线,等你来follow

    大家好,今天我将在有三AI开设新专栏<Python进阶>.在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件.数据的处理,Python各种好用的库如NumPy.Sc ...

  6. Python进阶(2)

    Python进阶(2) 题目来自于慕课网,python进阶课程 本系列笔记来自于慕课网的学习成果. 题目1 Python中自定义排序函数 Python内置的sorted()函数可对list进行排序: ...

  7. leetcode与python进阶学习总结

    转自:leetcode与python进阶学习总结 l1是一个链表型,val是其属性,以下句子意义为如果l1不为空则取l1.val否则取0,节省代码空间,干净利落 x= l1.val if l1 els ...

  8. python进阶指南_Python特性工程动手指南

    python进阶指南 介绍 (Introduction) In this guide, I will walk through how to utilize data manipulating to ...

  9. [转载] Python进阶:设计模式之迭代器模式

    参考链接: Python中的迭代器 在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一 ...

  10. python进阶19垃圾回收GC

    原创博客链接:python进阶19垃圾回收GC 垃圾收集三大手段 一.引用计数(计数器) Python垃圾回收主要以引用计数为主,分代回收为辅.引用计数法的原理是每个对象维护一个ob_ref,用来记录 ...

最新文章

  1. 网络推广——网络推广专员在面对不同阶段网站优化各有妙计
  2. RocketMQ有哪些消息类型?springboot如何整合rocketMQ
  3. java水仙花数代码_java知识分享篇(五)
  4. Android-Universal-Image-Loader学习笔记(二)--LruDiscCache
  5. 阿里巴巴的AI“发动机”
  6. IOS OpenGL ES GPUImage 图像 XYDerivative 边缘检测 GPUImageXYDerivativeFilter
  7. coderunner运行c语言提示错误,vscode安装及使用coderunner运行C程序教程
  8. 社区产品策划4元素:个人中心、内容、消息盒子、导航
  9. 5000字干货 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost总结
  10. Idea--git合并多次commit为一个(合并提交)--实例
  11. 5G QoS控制原理专题详解-基础概念(3)
  12. 超详细如何配置将WAN接入
  13. 教育对人的改变有多大?
  14. 到底什么才是商业智能(BI)?数字化时代你应该了解这些
  15. 网络摄像头Rtsp直播方案(二)
  16. 一套开源快速开发平台--若依(ruoyi)
  17. 图拉普拉斯矩阵的定义、推导、性质、应用
  18. 陈晨博士|可见光通信LiFi技术简介
  19. Python识别快递单号(条形码识别、字符识别,Tesseract-OCR)
  20. ubuntu下安装显卡驱动

热门文章

  1. 2020年中国人口出生率为8.52‰,首次跌破10‰,创下1978来新低
  2. Android TV开机优化
  3. 火狐扩展下载失败_Firefox中扩展程序和主题安装失败的解决方法
  4. flash Android 11.5,增强稳定性 Flash Player 11.5已发布
  5. SAP培训及ABAP学习入门必读
  6. 微图App有哪些实用的功能?
  7. HTML5+CSS3 从入门到精通(2)
  8. 人类微笑表情识别(HOG算法)
  9. 三星s9更新android9.0,三星Galaxy S9/S9+ Android 9.0系统更新新进展
  10. 科学计算机复杂公式计算公式,超级公式计算器