课程目标
- 递归算法
- 回溯算法
详情解读
1.递归算法
递归就是一个函数调用自身
1.函数直接或者间接调用自身
2.必须具有递归结束条件
3.每一次递归,问题规模缩小
4.Python个限制了递归深度sys.getrecursionlimit()
递归实例:求两个数之间所有整数之和
import sys
print(sys.getrecursionlimit())
def recusion_sum(min,max):
if min>max:
return 0
else:
return min+recusion_sum(min+1,max)
print(recusion_sum(1,3))
2.回溯算法
- 回溯算法(探索与回溯法)是一种选优搜索法,又称之为试探法
- 按选优条件向前搜索,以达到目的。但当探索到某一步时,发现原来的选择并不优或达不到目的,就退回一步重新选择
- 这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态点称为“回溯点”
经典算法案例: 八皇后问题
在一个 8x8 的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解
3.代码实现
放子策略
1.从上往下逐行放子
2.每一个落子用一个元组表示(row, col)
3.每一个成功的方案用一个列表表示。solution1 = [(row1, col1), (row2, col2),…,(row8, col8)]
4.每成功实现一个方案,返回一个
伪代码 - 冲突判定
def is_conflict(solution, newpos):
if newpos 与 solution 不冲突:
return False
else:
return True
伪代码 - 放子函数
def play(row=0, solution=[]):
if row == 8:
yield solution
for j in col:
newpos = (row, j)
if not is_conflict(solution, newpos):
for sol in play(row+1, solution+[newpos])
yield sol
Python实现
def is_conflict(solution,newpos):
for pos in solution:
if pos[0]==newpos[0] or pos[1]==newpos[1] or abs(pos[0]-newpos[0])==abs(pos[1]-newpos[1]):
return True
return False
def play(row=0,solution=[]):
checker=8
if row==checker:
yield solution
else:
for i in range(checker):
newpos=(row,i)
if not is_conflict(solution,newpos):
for sol in play(row+1,solution+[newpos]):
yield sol
n=0
for i in play():
n+=1
print(i)
for chess in i:
start=chess[1]
print('-'*start,'*','-'*(7-start),sep='')
print('~'*30)
print(n)