《python全栈工程师 - 数据结构与算法》:递归与回溯

《python全栈工程师 - 数据结构与算法》

课程目标

  1. 递归算法
  2. 回溯算法

详情解读

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.回溯算法

  1. 回溯算法(探索与回溯法)是一种选优搜索法,又称之为试探法
  2. 按选优条件向前搜索,以达到目的。但当探索到某一步时,发现原来的选择并不优或达不到目的,就退回一步重新选择
  3. 这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态点称为“回溯点”

经典算法案例: 八皇后问题

在一个 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值