返回信息流conflict函数用来判断下一个皇后的位置与之前皇后是否冲突。它有两个参数,第一个是前面所有皇后的状态元组,例如:(7,2,0,5,1,4,6)表示第1行的皇后在第8列,第2行的皇后在第3列,第3行的皇后在第1列.....等等。第二个参数是最后一个皇后的列位置。
小弟对于queens函数的递归不甚理解,求大神指教。
这是一条镜像帖。来源:北邮人论坛 / python / #7880同步于 2015/7/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
[问题]利用生成器解决棋盘八皇后问题
Shawnion
2015/7/22镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
首先,有一个问题:conflict函数的第6行return False应该在第3行开始的for循环外边。也就是对所有的可能的conflict的情况都判断完才能return False
我对这里的queens函数的理解:
假设创建了一个生成器q = queens()
每执行q.next()一次会产生一种n皇后的排布。
因此 for i in q: print i 会输出所有的排布可能
关于递归层次的分析
调用顺序:
first layer,也就是最外围的queens()会首先生成第一行的皇后可能在的pos(通过conflict函数);接着,pos值会追加到state元组的后边,并把它作为参数,调用第二层的queens()(第14行);在不久的将来接到第二层的返回结果后,通过第15行的yield把结果返回给上层调用者,也就是主函数;
second layer: 会首先生成第2行的皇后可能在的pos;接着,pos值会追加到state元组的后边,并作为参数,调用第三层的queens()(第14行);通过第15行的yield把结果返回给上层调用者,也就是第一层的queens();
...
8th layer: 这是递归中最里边的一层调用,在找到not conflict的一个pos值后,由于len(state) == num-1 is True, 他会把该pos值yield给上一层的调用者,也就是第七层的queens()函数。
返回顺序:
在第七层中,收到第八层传出来的一个值会放在result里(14行),从而进入15行,将(pos,) + result yield给第六层;
第六层接着将收到的第七层传出来的结果放在result里, yield给第五层
...
直到第一层收到的第二层传出来的结果放在result里,这时(pos,) + result是8个位置的值,把它们yield给主函数
每个queens()函数中不服合要求的可能(conflict返回值是Ture的分支,或者第9行的for循环结束)都会触发StopIteration异常而结束,并不会产生yield值出来。
【 在 Shawnion 的大作中提到: 】
: [upload=1][/upload]
: conflict函数用来判断下一个皇后的位置与之前皇后是否冲突。它有两个参数,第一个是前面所有皇后的状态元组,例如:(7,2,0,5,1,4,6)表示第1行的皇后在第8列,第2行的皇后在第3列,第3行的皇后在第1列.....等等。第二个参数是最后一个皇后的列位置。
: 小弟对于queens函数的递归不甚理解,求大神指教。
: ...................
多谢大神解答
【 在 downtown 的大作中提到: 】
: 首先,有一个问题:conflict函数的第6行return False应该在第3行开始的for循环外边。也就是对所有的可能的conflict的情况都判断完才能return False
: 我对这里的queens函数的理解:
: 假设创建了一个生成器q = queens()
: ...................