1. 程式人生 > >11月02日(第4天_八皇后、遞迴(因數分解、階乘))

11月02日(第4天_八皇后、遞迴(因數分解、階乘))

今天主要講了八皇后、遞迴。

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)