這是教材上的代碼: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.對于八皇后,就更易理解了。加了對沖突的判斷,即便是要找的解了。
新聞熱點
疑難解答