11月02日(第4天_八皇后、递归(因数分解、阶乘))

来源:互联网 发布:python pyqt5 安装 编辑:程序博客网 时间:2024/06/07 04:51

今天主要讲了八皇后、递归。


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)+1width = len(t)#1.生成棋盘u1 = [' ',]*width #这里的复制也要注意u = []i = 1while i<=high:    u.append(u1.copy())#这里一定要留意                        #错误代码:u = u.append(u1.copy())                       #错误原因:'NoneType' object has no attribute 'append'    i = i+1# u#2.按行打印ti = 0for k in t:    u[i][k] = "Q"    i = i+1u

运行结果:

[['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 L1fenjie(num)

3. 定义一个函数用于求阶乘。

def jiecheng(n):    if n ==1:        return 1    return n * jiecheng(n - 1) jiecheng(4)
原创粉丝点击