这是教材上的代码:def conflict(state, nextX): nextY = len(state) for i in range(nextY): if abs(state[i]-nextX) in (0, nextY-i): return True return Falsedef 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....",resulta=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,)+resulta=list(test(4))print len(a)print a两个yield很关键,第一个是结束递归的条件,第一个,生成N个的元组,练习时可以改i,为POS,就像八皇后了。5.理解了4.对于八皇后,就更易理解了。加了对冲突的判断,即便是要找的解了。
新闻热点
疑难解答