11月02日(第4天_八皇后、遞迴(因數分解、階乘))
阿新 • • 發佈:2019-01-25
今天主要講了八皇后、遞迴。
1.
(1) 八皇后問題:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。目前用圖論的方法解出92種結果。
其中的8種結果是在每行依次填[0,2,4,6,1,3,5,7]這個迴圈數列(如果第一行填5,第二行就填寫7,第三行就填寫0,這樣依次填好)。現要求每行依次填:[0,2,4,6,1,3,5,7],將其打印出一個。
#八皇后序列,每行依次填:[0,2,4,6,1,3,5,7],先打印出一個
t = [0,2,4,6,1,3,5,7]
high = max(t)+1
width = len (t)
#1.生成棋盤
u1 = [' ',]*width #這裡的複製也要注意
u = []
i = 1
while i<=high:
u.append(u1.copy())#這裡一定要留意
#錯誤程式碼:u = u.append(u1.copy())
#錯誤原因:'NoneType' object has no attribute 'append'
i = i+1
# u
#2.按行列印t
i = 0
for k in t:
u[i][k] = "Q"
i = i+1
u
執行結果:
[['Q', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', 'Q', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', 'Q', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', 'Q', ' '], [' ', 'Q', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', 'Q', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', 'Q', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', 'Q']]
(2) 八皇后問題,把按照[0,2,4,6,1,3,5,7]迴圈填的8種可能都打印出來。
sequence = [0,2,4,6,1,3,5,7,0,2,4,6,1,3,5,7]
#1.每次都要重新生成棋盤,不然就會被上一個填好的u蓋住,故定義一個生成棋盤的函式
def qipan():
u1 = [' ',]*8 #這裡的複製也要注意
u = [] ; i = 1
while i<=8:
u.append(u1.copy())#這裡一定要留意
#錯誤程式碼:u = u.append(u1.copy())
#錯誤原因:'NoneType' object has no attribute 'append'
i = i+1
return(u)
u = qipan()
#2.填皇后
for j in range(8):
u=qipan()
seq = sequence[j:j+8]
row = 0
for q in seq:
u[row][q] = '*'
row = row+1
print(seq)
print(u)
執行結果:
[0, 2, 4, 6, 1, 3, 5, 7]
[['*', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', '*', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', '*', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', '*', ' '], [' ', '*', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', '*', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', '*', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', '*']]
[2, 4, 6, 1, 3, 5, 7, 0]
[[' ', ' ', '*', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', '*', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', '*', ' '], [' ', '*', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', '*', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', '*', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', ' ', ' ', ' ', ' ', ' ', ' ', ' ']]
[4, 6, 1, 3, 5, 7, 0, 2]
[[' ', ' ', ' ', ' ', '*', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', '*', ' '], [' ', '*', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', '*', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', '*', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', '*', ' ', ' ', ' ', ' ', ' ']]
[6, 1, 3, 5, 7, 0, 2, 4]
[[' ', ' ', ' ', ' ', ' ', ' ', '*', ' '], [' ', '*', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', '*', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', '*', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', '*', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', '*', ' ', ' ', ' ']]
[1, 3, 5, 7, 0, 2, 4, 6]
[[' ', '*', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', '*', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', '*', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', '*', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', '*', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', '*', ' ']]
[3, 5, 7, 0, 2, 4, 6, 1]
[[' ', ' ', ' ', '*', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', '*', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', '*', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', '*', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', '*', ' '], [' ', '*', ' ', ' ', ' ', ' ', ' ', ' ']]
[5, 7, 0, 2, 4, 6, 1, 3]
[[' ', ' ', ' ', ' ', ' ', '*', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', '*', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', '*', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', '*', ' '], [' ', '*', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', '*', ' ', ' ', ' ', ' ']]
[7, 0, 2, 4, 6, 1, 3, 5]
[[' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', '*', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', '*', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', '*', ' '], [' ', '*', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', '*', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', '*', ' ', ' ']]
接下來是Tim Chan大神處理這個問題的程式碼,又簡潔打印出來又美觀:
li = [0,2,4,6,1,3,5,7]
for j in range(8):
li2 = li[j:]+li[:j]
print('-------------------%d-------------------'% (j+1))
print(li2)
for i in li2:
s = [' ']*8
s[i] = '*'
print(str(s))
執行結果:
-------------------1-------------------
[0, 2, 4, 6, 1, 3, 5, 7]
['*', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', '*', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', '*', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', '*', ' ']
[' ', '*', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', '*', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', '*', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', ' ', '*']
-------------------2-------------------
[2, 4, 6, 1, 3, 5, 7, 0]
[' ', ' ', '*', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', '*', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', '*', ' ']
[' ', '*', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', '*', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', '*', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', ' ', '*']
['*', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
-------------------3-------------------
[4, 6, 1, 3, 5, 7, 0, 2]
[' ', ' ', ' ', ' ', '*', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', '*', ' ']
[' ', '*', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', '*', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', '*', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', ' ', '*']
['*', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', '*', ' ', ' ', ' ', ' ', ' ']
-------------------4-------------------
[6, 1, 3, 5, 7, 0, 2, 4]
[' ', ' ', ' ', ' ', ' ', ' ', '*', ' ']
[' ', '*', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', '*', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', '*', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', ' ', '*']
['*', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', '*', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', '*', ' ', ' ', ' ']
-------------------5-------------------
[1, 3, 5, 7, 0, 2, 4, 6]
[' ', '*', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', '*', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', '*', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', ' ', '*']
['*', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', '*', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', '*', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', '*', ' ']
-------------------6-------------------
[3, 5, 7, 0, 2, 4, 6, 1]
[' ', ' ', ' ', '*', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', '*', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', ' ', '*']
['*', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', '*', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', '*', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', '*', ' ']
[' ', '*', ' ', ' ', ' ', ' ', ' ', ' ']
-------------------7-------------------
[5, 7, 0, 2, 4, 6, 1, 3]
[' ', ' ', ' ', ' ', ' ', '*', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', ' ', '*']
['*', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', '*', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', '*', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', '*', ' ']
[' ', '*', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', '*', ' ', ' ', ' ', ' ']
-------------------8-------------------
[7, 0, 2, 4, 6, 1, 3, 5]
[' ', ' ', ' ', ' ', ' ', ' ', ' ', '*']
['*', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', '*', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', '*', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', '*', ' ']
[' ', '*', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', '*', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', '*', ' ', ' ']
2. 對給出的正整數進行質因數分解,如60 = 2*2*3*5。
num0 = input('Please input a number:')
num = int(num0)
L1 = []
def fenjie(num):
for i in range(2,num+1):
if num % i ==0:
L1.append(i)
fenjie(int(num/i)) #為什麼 return fenjie(int(num/i))不行?
return L1
fenjie(num)
3. 定義一個函式用於求階乘。
def jiecheng(n):
if n ==1:
return 1
return n * jiecheng(n - 1)
jiecheng(4)