您的位置:首页 > 编程语言 > Python开发

Python八皇后问题的学习体会与分析-递归的运用

2017-02-08 22:37 316 查看
这是教材上的代码:
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 queens(num, state=()):
#print num,state
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,)):
#生成八或N个的元组
yield (pos, ) + result
分析一:
1.此种方法看上去较酷,感到很高大上的编程。占用内存小,运用了生成器。
2.教材上讲了如果不能安排好下一下皇后,则进行上一个皇后的位置改变,再迭代。但我感觉是究举之后的依次判断,即列出所有可能的位置组合,再进行一一判断。
3.可以先理解,用递归实理的N层迭代。如下代码
def my_func(num, state=()):

for i in range(9):
print i,

if len(state) == num-1:
yield (len(state),)
#print "len state",len(state)
else:
for result in my_func(num, state+(0,)):
yield (len(state),)+result
print "resault....",result

a=list(my_func(8))

4.用递归实现的N层迭代:

def test(num,state=()):
print "start.",
for i in range(num):
print i,
if len(state)==num-1:
yield (100,)
else:
for result in test(num,state+(0,)):
print "in."
print "recur...len result is: ",len(result),result
yield (50,)+result

a=list(test(4))
print len(a)
print a两个yield很关键,第一个是结束递归的条件,第一个,生成N个的元组,练习时可以改i,为POS,就像八皇后了。

5.理解了4.对于八皇后,就更易理解了。加了对冲突的判断,即便是要找的解了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: