Python學習筆記之八皇后問題

2021-06-25 17:12:24 字數 3205 閱讀 3844

此python版本:python 3.3.5

一、yield語句

任何包含 yield 語句的函式稱為生成器, yield 不像 return 那樣返回值,yield 每次產生多個值。使用 yield 語句每次產生乙個值後,函式就會被凍結:即函式停在這一點等待被啟用,啟用後從此點開始執行。

例:>>> def flatten(nested):

for sublist in nested:

for element in sublist:

return element

>>> nested = [[1, 2],[3, 4], [5]]

>>> for num in flatten(nested):

print (num)

traceback (most recent call last):

file "", line 1, in

for num in flatten(nested):

typeerror: 'int' object is not iterable

程式報錯,說 flatten(nested) 是不可迭代的,所以來看一下 flatten(nested) 到底輸出了什麼。

>>> nested = [[1, 2],[3, 4], [5]]

>>> flatten(nested)

1>>> flatten(nested)1

發現原來 flatten(nested) 只輸出了乙個 int 型別的數,即當函式 flatten 在對列表 nested 進行迴圈的時候,第一遍採集到數字 1 時,就 return 了,函式就結束了。

看一下yield

>>> def flatten(nested):

for sublist in nested:

for element in sublist:

yield element

>>> nested = [[1, 2],[3, 4], [5]]

>>> for num in flatten(nested):

print (num)12

345

>>> list(flatten(nested))

[1, 2, 3, 4, 5]

可以看到,此時 flatten(nested) 返回的是乙個列表,可迭代輸出。即當函式 flatten 對 nested 進行迴圈的時候,採集到第乙個值 1 的時候,函式即凍結,啟用後仍會繼續執行雙迴圈,而不是結束函式。

二、八皇后問題

要求:在 8 * 8 的棋盤上,8 個皇后不在同行、同列、同對角線。

(1)定義衝突

>>> 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

其中,nextx 指下乙個皇后將要放置的橫座標,也就是列。nexty 指下乙個皇后將要放置的縱座標,即行。state是乙個列表,列表內存放著已經放置好的皇后的位置,即存放著元組 (x , y) ,state[ i ] = j 指第(i + 1)行的皇后在第(j + 1)列。

注: if abs(state[i] - nextx) in (0, nexty - i):  中的 (0, nexty - i):  指前面的數是否為 0 或者 nexty - i 兩者中的乙個,並不是指處在某個範圍裡面。

(2)放置皇后

>>> def queens(num = 8, 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,)):

yield (pos,) + result

注:程式分為 

if len(state) == num - 1:  和 

else:  兩部分,是因為,遞迴都需要有乙個遞迴結束的點,否則,遞迴就會無止境的不斷進行下去。

其中, for pos in range(num):  這一行,指的是給將要放置的新皇后,她的縱座標已固定(由定義衝突裡的 nexty = len(state) 來固定的),所以,需要在8個列位置上,給她進行選擇放置的位置。

如果放置 4 個皇后,則有 2 種放置方法:

>>> list(queens(4))

[(1, 3, 0, 2), (2, 0, 3, 1)]

應用 print 可以把不同的放置方法,一行一行列印出來。

(3)打包輸出

輸出簡易的放置了皇后的棋盤。

>>> def prettyprint(solution):

def line(pos, length = len(solution)):

return '. 

' * (pos) + 'x 

' + '. 

' * (length - pos - 1)

for pos in solution: 

#依次取出隨機挑選的方案裡的每個數,即每位皇后在自己的行中坐所在的列。

print (line(pos))

>>> import random

>>> prettyprint(random.choice(list(queens(8)))) 

#在queens(8) 的方案裡隨機挑選乙個

.  . 

x . 

. . . .

. . 

. . 

. x . .

. . 

. . 

. . . x

. x 

. . 

. . . .

.  . 

.  x 

.  . 

.  .

x . 

. . 

. . . .

. . 

.  . 

. . x .

. . 

. . 

x . . .

20190915學習PYTHON 八皇后問題

20190915學習python 八皇后問題 剛剛開始學習python。先試完成乙個經典的深度優先演算法,就是八皇后問題。一邊學一邊查,完成了 python八皇后問題求解 2019 9 15 n 8 數量 nsolve 0 解的個數 a 0 n 用於儲存各行上皇后的位置,使用列表 檢查乙個位置第p行...

菜鳥學習之python八皇后問題學習

state 表示元祖 這裡表示乙個回溯問題 在八皇后問題每一次遞迴的層面是一行 defconflict state,nextx nexty len state fori in range nexty if abs state i nextx in 0,nexty i return true retu...

學習框架之 八問

我們先介紹八大問,然後來看怎麼使用它來挖掘知識的連線點。八大問是乙個提問的框架,將針對資訊 觀點 事件 經歷等的提問,分為 前 因 後 果,適 用 邊 界 八類。這八類問題,可用來分析或整理資訊,把資訊變成知識,並找到知識的連線點。八大問又可以分為兩組,前因後果和適用邊界,前因後果用於分析資訊,適用...