看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯

书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码

deftable(m, lst):'''绘制m列的棋盘,每行有个皇后旗子'''head= '┌' + '─┬' * (m-1) + '─┐'row= lambda x: '│' + '│' * x + '╳│' + '│' * (m - x - 1)

trow= '├' + '─┼' * (m-1) + '─┤'tail= '└' + '─┴' * (m-1) + '─┘'

print(head)for i, n inzip(range(len(lst)), lst):print(row(n))print (trow) if i < len(lst) - 1 else print(tail)

queens= [0]*8

defrightqueen(lst, m):'''判断lst的所有皇后是否与下一行的m位置皇后干涉,不干涉则返回True'''

for i, n inzip(range(len(lst)), lst):if(n == m or len(lst) - i == m - n or len(lst) - i == n -m):returnFalsereturnTruedefcalqueen(lst, n):'''求解第n个皇后与之前的皇后不干涉

如果第n行成功则求解n+1行,否则求解n-1行且复位n行'''

for i in range(lst[n], 8):ifrightqueen(lst[:n], i):

lst[n]=i

calqueen.count+= 1

print(calqueen.count)

table(8, lst[:n+1])if n < 7: calqueen(lst, n+1)break

else:#如果遍历8个之后仍然没有解则重新求解上一行

lst[n] =0

lst[n-1] += 1

print('求解上一行')

calqueen(lst, n-1)

calqueen.count=0

calqueen(queens, 0)

前面那个table函数只是用来绘制棋盘的,写完后感觉Python确实是很简洁的语言,当然可以更简洁,现在我的代码风格还保留很强的C语言风格,这个转变估计还需要一段时间

说他ugly倒并不是因为他没有使用迭代器,主要的问题在于函数的两个分支都使用了迭代,只有达到第八层时才会结束迭代,这个代码迭代次数要达到100多次,这样多的迭代其内存占用以及运行效率都是不太好的

因此改进版的代码应该是在失败的时候返回运行结果以便减少迭代次数,调整后的代码如下:

deftable(m, lst):'''绘制m列的棋盘,每行有个皇后旗子'''head= '┌' + '─┬' * (m-1) + '─┐'row= lambda x: '│' + '│' * x + '╳│' + '│' * (m - x - 1)

trow= '├' + '─┼' * (m-1) + '─┤'tail= '└' + '─┴' * (m-1) + '─┘'

print(head)for i, n inzip(range(len(lst)), lst):print(row(n))print (trow) if i < len(lst) - 1 else print(tail)

queens= [0]*8

defrightqueen(lst, m):'''判断lst的所有皇后是否与下一行的m位置皇后干涉,不干涉则返回True'''

for i, n inzip(range(len(lst)), lst):if(n == m or len(lst) - i == m - n or len(lst) - i == n -m):returnFalsereturnTruedefcalqueen(lst, n):'''求解第n个皇后与之前的皇后不干涉

如果第n行成功则求解n+1行,否则求解n-1行且复位n行'''

for i in range(8):ifrightqueen(lst[:n], i):

lst[n]=i

calqueen.count+= 1

print(calqueen.count)

table(8, lst[:n+1])if n < 7:if not calqueen(lst, n+1): continue

returnTrueelse:#如果遍历8个之后仍然没有解则重新求解上一行

print('求解上一行')

calqueen.count-= 1

returnFalse

calqueen.count=0

calqueen(queens, 0)

减少了迭代次数后至少程序是比较合理的了,不过在看过使用生成器,迭代器的代码之后还是觉得我对Python以及迭代器编程的感觉太少了,为了增强感觉,合上书按照自己的理解又盲写了一遍,当然代码跟书上的不太一致了,但思想差不多

deftable(m, lst):'''绘制m列的棋盘,每行有个皇后旗子'''head= '┌' + '─┬' * (m-1) + '─┐'row= lambda x: '│' + '│' * x + '╳│' + '│' * (m - x - 1)

trow= '├' + '─┼' * (m-1) + '─┤'tail= '└' + '─┴' * (m-1) + '─┘'

print(head)for i, n inzip(range(len(lst)), lst):print(row(n))print (trow) if i < len(lst) - 1 else print(tail)defrightqueen(lst, m):'''判断lst的所有皇后是否与下一行的m位置皇后干涉,不干涉则返回True'''

for i, n inzip(range(len(lst)), lst):if(n - m in (0, len(lst) - i, i -len(lst))):returnFalsereturnTruedefcalqueen(lst, n):'''求解第n个皇后与之前的皇后不干涉

只在第八层提交数据,其余每一层都是把本层的所有可能和后面的所有可能相加'''

for i in range(8):

calqueen.total+= 1

ifrightqueen(lst, i):

calqueen.count+= 1

if n == 7:

calqueen.number+= 1

print(calqueen.number, calqueen.count, calqueen.total)yield lst +[i]else:for l in calqueen(lst + [i], n + 1):yieldl

calqueen.total=0

calqueen.count=0

calqueen.number=0for l incalqueen([], 0):

table(8, l)

事实上两个函数的核心代码只有13行,使用in和元组来替代3个条件判断,用迭代器替代对函数返回值的判断,因为如果迭代器为空,则上层调用函数遍历就会失败,自动解决了我原来算法的问题

而且这个程序能够遍历出92个八皇后的解法,虽然我之前的代码改改应该也能实现,但是不会有这么精简

因为生成器的存在,使得迭代器在使用时非常的方便,后期在处理一些需要循环层进迭代的方法时也应该优先考虑生成器,迭代器的方式.

八皇后算法python_Python学习二(生成器和八皇后算法)相关推荐

  1. 强化学习经典算法笔记(十二):近端策略优化算法(PPO)实现,基于A2C(下)

    强化学习经典算法笔记(十二):近端策略优化算法(PPO)实现,基于A2C 本篇实现一个基于A2C框架的PPO算法,应用于连续动作空间任务. import torch import torch.nn a ...

  2. java 黑白皇后算法_JNI学习之步步深入四--皇后的祝福

    上篇中简单介绍了,java中的类型和C中的类型的映射的,本篇将以一个无聊的实例来看看JNI中数组的使用. 皇后的祝福,思路很简单,就是利用我们耳熟能详的把皇后问题结合JNI来实现一点点小小的乐趣,在快 ...

  3. 推荐系统学习(二)--UserCF与ItemCF推荐算法

    文章目录 基于近邻的推荐算法 UserCF算法原理 1. 构建用户物品评分表 2. 相似度度量 3. 计算推荐结果 4. 惩罚热门物品 ItemCF算法原理 1. 计算物品之间的相似度 1. 建立用户 ...

  4. 《数据结构与算法》(二十五)- 排序算法:快速排序

    目录 前言 1. 快速排序 1.1 快速排序算法 1.2 快速排序算法复杂度分析 1.3 快速排序优化 2. 总结 原文地址:https://program-park.github.io/2021/1 ...

  5. 【算法】学习笔记(0):算法初探(逻辑抽象 + 示例 + 代码实现)

    什么是算法? 人生皆算法,算法的本质,是解决问题的方法,遇到问题,寻找答案,解决问题,是作为一个人,一生都在做的事情. 算法是人类思维的产物,是解决问题的方案,并且,它能够映射到计算机世界去实现,完成 ...

  6. 算法学习二,红黑树查找算法

    二叉查找树,对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低. 红黑树保证在最坏的情况下插入和查找效率都能保证在对数(Log(n))的时间复杂度内完成. 1.红黑树 ...

  7. GNSS算法进阶(二)- kalman滤波单点定位算法代码实现

    状态预测 kalman滤波与前面实现的最小二乘最大的区别就在于,kalman滤波用到了历史状态信息,即进行状态预测. 公式中BU(k)(控制输入)在我们定位模型中用不到. 从(k-1)时刻将状态转移到 ...

  8. 《算法》学习笔记2.1 初级排序算法

    2.1 初级排序算法 2.1.1 选择排序 2.1.2 插入排序 2.1.3 选择.插入排序比较 2.1.4 希尔排序 2.1.5 其他 数据类型 几种典型的部分有序数组 插入排序中的哨兵 2.1.1 ...

  9. 【算法】学习笔记(1):算法就是人类去教会计算机的方法

    人生处处皆算法,算法是解决问题之道. 对于计算机科学中的算法,我更喜欢将其理解为利用人类思维之一:计算机思维,去解决一些人类不擅长的问题,比如大量重复运算,然后,人类使用计算机编程语言去 教计算机解决 ...

最新文章

  1. shell设置系统环境变量的问题
  2. 读写分离原来这么简单,一个小注解就够了
  3. 帝国cms会员充值交易推广分润系统的界面实现与开发记录
  4. 【深度学习入门到精通系列】目标检测评估之P-R曲线深入理解
  5. 小菜学习Lucene.Net(更新3.0.3版本使用)
  6. 如何在word写小论文在正文分栏后第一页左下角添加 项目 基金 作者简介 (添加通栏脚注)
  7. android 判断是否有网络连接,判断网络连接类型
  8. 加减法叫做什么运算_小学四则运算基础知识,赶快给孩子存下吧!
  9. 牛客15499 Jxc军训(快速幂,逆元)
  10. 信息学奥赛一本通(1140:验证子串)
  11. python拼图游戏代码的理解_有意思的JS(1)拼图游戏 玩法介绍及其代码实现
  12. 通过srvctl add命令添加database信息到srvctl管理器
  13. html5详细的中文手册,Web前端
  14. PHP中Foreach在引用时的陷阱
  15. python绘制条形图例题_[宜配屋]听图阁 - Python+matplotlib+numpy绘制精美的条形统计图...
  16. 秋色园QBlog技术原理解析:性能优化篇:读写分离与文本数据库(十八)
  17. 关于Loadrunner11破解的各种问题。。。泪奔。。。
  18. Python 之霍兰德人格与职业分析
  19. 安卓手机APP 开发
  20. java聊天系统异常问题_聊天室bug问题

热门文章

  1. 终端下载文件(windows和linux)
  2. python 网络爬虫(一)
  3. Authentication method 'caching_sha2_password' not supported by any of the available plugins.
  4. [译] Lenses:可组合函数式编程的 Getter 和 Setter(第十九部分)
  5. LINUX开启SNMP方法
  6. linux基础(day22)
  7. phpstrom配置svn/git提交
  8. 要离校了,使用SSM为学校开发后勤报修系统
  9. Spark源码学习之IDEA源码阅读环境搭建
  10. 鹅厂2020暑期实习第二次二面