数据结构与算法设计_PPT_第4章_递归.pptVIP

  • 4
  • 0
  • 约4.65千字
  • 约 37页
  • 2021-03-09 发布于北京
  • 举报
第四章 递归 递归的概念及设计方法 递归与回朔法 递归应用实例 递归评价 迷宫问题 把一只老鼠赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍。在迷宫的唯一出口处放置一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。 求解思想:回溯法是一种不断试探且及时纠正错误的搜索方法 采用回溯法对迷宫问题进行求解 从入口出发,按某一方向向前探索,若某处可以到达,则到达新起点;否则试探下一方向。 若所有的方向均没有通路,则沿原路返回到前一点,换下一个方向再继续试探,直到所有可能的通路都试探到。 结果是或找到一条通路,或无路可走又返回到入口点。 求解时,为保证在某一点后不能向前继续行走时,能正确返回前一点,需要用一个栈保存所到达的每一点的下标,及从该点前进的方向。 若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的 若一个过程直接地或间接地调用自己, 则称这个过程是递归的过程。 递归的定义 直接递归 fun_a() {? …? fun_a()? … }  递归的定义 间接递归 fun_a() {? …? fun_b()? …}   fun_b() {? …? fun_a()? …} * 一个问题要采用递归方法来解决时,必须符合以下三个条件 可以把一个问题转化为一个新的问题,这个新的问题的解决方法与原问题的解法相同,只是所处理的对象有所不同,这些被处理的对象之间有规律地递增或递减 可以通过转化过程使问题得到简化 必定要有一个明确的结束递归的条件,否则递归将会无止境地进行下去,直到耗尽系统资源,也就是说必须要有终止递归的条件 递归的问题 * 适用递归技术的问题 以下三种情况常常用到递归方法 定义是递归的 数据结构是递归的 问题的解法是递归的 * 求解阶乘函数的递归算法 long Factorial ( long n ) { if ( n == 0 ) return 1; else return n * Factorial (n-1); } 例如,阶乘函数 定义是递归的 例如,单链表结构 f ? f ? 数据结构是递归的 一个结点,它的指针域为NULL,是一个单链表 一个结点,它的指针域指向单链表,仍是一个单链表。 f f f f f ? a0 a1 a2 a3 a4 递归找链尾 数据结构是递归的 搜索链表最后一个结点并打印其数值 void Print ( ListNode *f ) { if ( f -link == NULL ) printf(“%d\n”, f -data); else Print ( f -link ); } 问题的解法是递归的 汉诺塔(Tower of Hanoi)问题的解法 如果 n = 1,则将这一个盘子直接从 A 柱移到 C 柱上 否则,执行以下三步 用 C 柱做过渡,将 A 柱上的 (n-1) 个盘子移到 B柱上 将 A 柱上最后一个盘子直接移到 C 柱上 用 A 柱做过渡,将 B 柱上的 (n-1) 个盘子移到 C柱上。 递归模型反映一个递归问题的递归结构 一般地,一个递归模型是由递归出口和递归体两部分组成 前者确定递归到何时为止 后者确定递归的方式 递归模型 递归出口的一般格式为 f(s0)=m0;这里的s0与m0均为常量,有的递归问题可能有几个递归出口 递归体的一般格式为: f(s)=g(f(s1), f(s2),……, f(sn),c1, c2,……,cm) s是一个递归“大问题” s1, s2,……, sn是递归“小问题” c1, c2,……,cm是若干个可以直接(用非递归方法)解决的问题 g是一个非递归函数,反映了递归问题的结构 递归模型 例如,阶乘函数 递归出口 递归体 递归模型 递归的执行过程 实际上,递归是把一个不能或不好直接求解的“大问题”转化为一个或几个“小问题”来解决 再把这些“小问题”进一步分解成更小的“小问题”来解决 如此分解,直至每一个“小问题”都可以直接解决 此时分解到递归出口 主程序 fact(4) 参数 4 计算 4*fact(3) 参数 3 计算 3*fact(2) 参数 2 计算 2*fact(1) 参数 1 计算 1*fact(0) 参数 0 直接定值 = 1 参数传递 结果返回 递归调用 回归求值 求解n!的过程 返回 1 返回 1 返回 2 返回 6 返回 24 递归设计 递归设计先要给出递归模型,再转换成对应的C语言函数 从递归的执行过程看,要解决f(s),不是直接求其解,而是转化为计算f(s’)和一个常量c’ 求解f(s’)的方法与环境和求解f(s)的方法与环境是相似的,但f(s)是一

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档