数据结构和算法
1.递归
- 斐波那契数列
- 汉诺塔:
def move(n, x, y, z): if n == 1: print(x, "-->", z) else: move(n - 1, x, z, y) # 将n-1个盘子从x借助 z移到y上 print(n, x, "-->", z) # 将第n个盘子从x移到z上 move(n - 1, y, x, z) # 将n-1个盘子从y借助x移到z上 move(3, "X", "Y", "Z")
- 八皇后问题
- 要把二维数组换行输出,更直观,用numpy是最简单方便的
- (用了最笨的方法)应反复更改不断改进代码
import numpy as np
# checkerboard = 8 * [8 * [0]]
checkerboard = [[0 for i in range(8)] for i in range(8)]
# print(np.array(checkerboard))
def notDanger(row, j, rs_checkerboard):
for i in range(row, 8):
for a in range(8):
rs_checkerboard[i][a] = 0
# print(np.array(rs_checkerboard))
flag1 = 0
flag2 = 0
flag3 = 0
flag4 = 0
# print("判读数组:", "[", row, ",", j, ']')
# 判断列的方向
for i in range(8):
if rs_checkerboard[i][j] == 1:
flag1 = 1
# print("[", row, ",", j, ']', "列方向", "[", i, ",", j, ']', "的方向存在1", '不存入')
break
# 判断左上方
for (i, a) in zip(range(row, -1, -1), range(j, -1, -1)):
if rs_checkerboard[i][a] == 1:
flag2 = 1
# print("[", row, ",", j, ']', "左上方", "[", i, ",", a, ']', "的方向存在1", '不存入')
break
# 判断右下方
for (i, a) in zip(range(row, 8), range(j, 8)):
if rs_checkerboard[i][a] != 0:
flag3 = 1
# print("[", row, ",", j, ']', "右下方", "[", i, ",", a, ']', "的方向存在1", '不存入')
break
# 判断右上方
for (i, a) in zip(range(row, -1, -1), range(j, 8)):
if rs_checkerboard[i][a] != 0:
flag4 = 1
# print("[", row, ",", j, ']', "右上方", "[", i, ",", a, ']', "的方向存在1", '不存入')
break
if flag1 | flag2 | flag3 | flag4:
return 0
else:
return 1
count = 0
def choice(row, n, checkerboard):
rss_checkerboard = checkerboard
# 递归截至条件
global count
if row == 8:
count += 1
print("第", count, "种方法")
print(np.array(rss_checkerboard))
else:
# 判断这个位置是否 合理
for j in range(n):
# print(np.array(rss_checkerboard))
if notDanger(row, j, checkerboard):
# 判断
# print("录入:", "[", row, ",", j, ']')
rss_checkerboard[row][j] = 1
# print(rss_checkerboard)
choice(row + 1, n, rss_checkerboard)
choice(0, 8, checkerboard)
-
注意事项 :
1.global 问题 在函数外部已经定义了变量n,在函数内部对该变量进行运算,运行时会遇到了这样的错误:主要是因为没有让解释器清楚变量是全局变量还是局部变量
2.python 对二维数组的创建 :checkerboard = [[0 for i in range(8)] for i in range(8)] checkerboard = 8*[8*[0]]
的不同
3.python 的自增