算法入门-暴力搜索法之回溯、递归法_第1页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、算法入门暴力搜索法之回溯、递归法在第一次的公开课中,我们讲到了穷举法。穷举法也被称为暴力搜索法,今天我们要讲的回溯法就是 暴力搜索法的一种。接下来我们讲到的很多算法跟“递归”这个概念有或多或少的关系,所以我们先说 说“递归”。现实中的递归从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?从前有座山, 山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?从前有座山,山里有座庙, 庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?比大雄在房间里,用时光电视看着未来的情况。电视画面中,比大雄在房间里,用时光电视看着未来的情况。电视画面中,比大雄在房间里,用时光

2、电视看着未来的情况阶乘的递归定义:, ,使用被定义对象的自身来为其下定义称为递归定义。 HYPERLINK /wiki/%E5%BE%B7%E7%BD%97%E6%96%AF%E7%89%B9%E6%95%88%E5%BA%94 h 德罗斯特效应是递归的一种视觉形式。图中女性手持的物体中有一幅她本人手持同一物体的小图片, 进而小图片中还有更小的一幅她手持同一物体的图片递归的应用在程序中,一个函数如果直接或者间接的调用了自身,我们就称之为递归函数。 写递归函数有两个要点:收敛条件 - 什么时候结束递归。递归公式 - 每一项与前一项(前N项)的关系。例子1:求阶乘。1deffac(num):2if

3、 num = 0:3return 14return num * fac(num - 1)Python对递归的深度加以了限制(默认1000层函数调用),如果想突破这个限制,可以使用下面的 方法。123import syssys.setrecursionlimit(10000)6return climb(num - 1) + climb(num - 2) + climb(num - 3)例子2:爬楼梯 - 楼梯有n个台阶,一步可以走1阶、2阶或3阶,走完n个台阶共有多少种不同的走法。1defclimb(num):2if num = 0:3return 14elif num 0:5return 01

4、2345678910from functools import lru_cachelru_cache()def climb(num): if num = 0:return 1 elif num 0:return 0return climb(num - 1) + climb(num - 2) + climb(num - 3)注意:上面的递归函数性能会非常的差,因为时间复杂度是几何级数级的。 优化后的代码。不使用的递归的代码。1defclimb(num):2a, b, c = 1, 2, 43for _ in range(num - 1):4a, b, c = b, c, a + b + c5re

5、turn a重点:有更好的办法的时候,请不要考虑递归。回溯法回溯法是 HYPERLINK /wiki/%E6%9A%B4%E5%8A%9B%E6%90%9C%E5%B0%8B%E6%B3%95 h 暴力搜索法中的一种。对于某些计算问题而言,回溯法是一种可以找出所有(或一部分)解 的一般性算法,尤其适用于约束满足问题(在解决约束满足问题时,我们逐步构造更多的候选解,并 且在确定某一部分候选解不可能补全成正确解之后放弃继续搜索这个部分候选解本身及其可以拓展出 的子候选解,转而测试其他的部分候选解)。经典案例例子1:迷宫寻路。12345678910111213141516171819迷宫寻路impo

6、rt random import sysWALL = -1ROAD = 0ROWS = 10COLS = 10def find_way(maze, i=0, j=0, step=1): 走迷宫if 0 = i ROWS and 0 = j 7 else ROAD35maze00 = mazeROWS - 1COLS - 1 = ROAD363738defdisplay(maze):39显示迷宫40for row in maze:41for col in row:42if col = -1:43print(, end= )44elif col = 0:45print(, end= )46else

7、:47print(fcol.ljust(2), end=)48print()495051defmain():52主函数53maze = 0 * COLS for _ in range(ROWS)54reset(maze)55display(maze)56find_way(maze)57print(没有出路!)585960if name = main :61main() HYPERLINK /indie-game-development/generate-tile-based-maze-with-backtracking/ h 说明:上面的代码用随机放置围墙的方式来生成迷宫,更好的生成迷宫的方式

8、请参考简单的使用回 溯法生成 Tile Based 迷宫一文。例子2:骑士巡逻 - 国际象棋中的骑士(),按照骑士的移动规则走遍整个棋盘的每一个方格,而且每个方格只能够经过一次。def patrol(board, i=0, j=0, step=1):巡逻if 0 = i SIZE and 0 = j SIZE and boardij = 0: boardij = stepif step = SIZE * SIZE: display(board) sys.exit(0)patrol(board, i + 1, j + 2, step + 1) patrol(board, i + 2, j + 1

9、, step + 1) patrol(board, i + 2, j - 1, step + 1)patrol(board, i + 1, j - 2, step + 1)def display(board):显示棋盘 for row in board:for col in row:print(fcol.rjust(2, 0), end= ) print()SIZE = 8骑士巡逻import sys12345678910111213141516171819202122232425262728patrol(board,i-1,j-2,step+1)29patrol(board,i-2,j-1,step+1)30patrol(board,i-2,j+1,step+1)31patrol(board,i-1,j+2,step+1)32boardij =033343536373839404142def main():主函数board = 0 * SIZE for _ in range(SIZE)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论