- 论坛徽章:
- 0
|
本帖最后由 hp_truth 于 2011-03-01 15:42 编辑
刚开始学python,看python基础教程那本书,被里面的yield弄晕了。
里面提到用yield解决八皇后问题, 人家好像都讲明白了,就是自己理解起来有点困难。
后来还是通过对比以前的方法来理解yield, 稍微好点了。- #! /usr/bin/env python
- __metaclass__ = type
- # 判断冲突的函数
- def conflict(state, nextX):
- nextY = len(state)
- for i in range(nextY):
- if abs(state[i] - nextX) in (0, nextY - i):
- return True
- return False
- # 书上的方法
- def queen1(num = 8, state = ()):
- for pos in range(num):
- if not conflict(state, pos):
- if len(state) == num -1:
- yield (pos,)
- else:
- for i in queen1(num, state + (pos,)):
- yield i + (pos,)
- # 以前用过的方法
- sum=[]
- def queen2(num, result = []):
- if len(result) == num:
- sum.append(result)
- else:
- for pos in range(num):
- if not conflict(result, pos):
- queen2(num, result + [pos])
- # 参照以前的方法, 对书上的方法稍微改了一下
- # 比书上的方法多了几次函数调用, 主要是体验一下
- # 递归调用中用到了几次yield, 但对外界来说,
- # 应该是 ‘yield i + [pos] 这 一句是真正的返回一种八皇后方案。
- # 而‘yield []’只是内部递归调用时返回。
- def queen3(num, result = []):
- if len(result) == num:
- yield []
- else:
- for pos in range(num):
- if not conflict(result, pos):
- for i in queen3(num, result + [pos]):
- yield i + [pos]
- def prettyprint(solution):
- def line(pos, length=len(solution)):
- return '. ' * (pos) + 'X ' + '. ' * (length-pos-1)
- for pos in solution:
- print line(pos)
- import random
- print len(list(queen1( 8 )))
- prettyprint(random.choice(list(queen1( 8 ))))
- queen2( 8 )
- print len(list(sum))
- prettyprint(random.choice(list(sum)))
- print len(list(queen3( 8 )))
- prettyprint(random.choice(list(queen3( 8 ))))
- i = queen3( 8 )
- print i.next()
复制代码 |
|