递归的概念递归过程与递归工作栈递归与回溯广义表.ppt
《递归的概念递归过程与递归工作栈递归与回溯广义表.ppt》由会员分享,可在线阅读,更多相关《递归的概念递归过程与递归工作栈递归与回溯广义表.ppt(61页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、n n递归的概念递归的概念n n递归过程与递归工作栈递归过程与递归工作栈n n递归与回溯递归与回溯n n广义表广义表递归的概念递归的概念n n递归的定义递归的定义 若一个对象部分地包含它自若一个对象部分地包含它自己己,或用它自己给自己定义或用它自己给自己定义,则称这个则称这个对象是递归的;若一个过程对象是递归的;若一个过程直接地或间直接地或间接地调用自己接地调用自己,则称这个过程是递归的则称这个过程是递归的过程。过程。n n以下三种情况常常用到递归方法。以下三种情况常常用到递归方法。n n 定义是递归的定义是递归的n n 数据结构是递归的数据结构是递归的n n 问题的解法是递归的问题的解法是递
2、归的定义是递归的定义是递归的求解阶乘函数的递归算法求解阶乘函数的递归算法long Factorial(long n)if(n=0)return 1;else return n*Factorial(n-1);例如,阶乘函数例如,阶乘函数求解阶乘求解阶乘 n!的过程的过程主程序主程序主程序主程序 main:fact(4)参数参数 4 计算计算 4*fact(3)返回返回 24参数参数 3 计算计算 3*fact(2)返回返回 6参数参数 2 计算计算 2*fact(1)返回返回 2参数参数 1 计算计算 1*fact(0)返回返回 1参数参数 0 直接定值直接定值=1 返回返回 1参参参参数数数数
3、传传传传递递递递结结结结果果果果返返返返回回回回递递递递归归归归调调调调用用用用回回回回归归归归求求求求值值值值数据结构是递归的数据结构是递归的n n 一个结点,它的指针域为一个结点,它的指针域为NULL,是是一个单链表一个单链表;n n 一个结点,它的指针域指向单链表,一个结点,它的指针域指向单链表,仍是一个单链表。仍是一个单链表。例如,单链表结构例如,单链表结构f f 搜索链表最后一个结点并打印其数值搜索链表最后一个结点并打印其数值template void Print(ListNode*f)if(f-link=NULL)cout data link);f f f f f a0a1a2a3
4、a4递归找链尾在链表中寻找等于给定值的结点并打印在链表中寻找等于给定值的结点并打印其数值其数值template void Print(ListNode*f,Type&x)if(f!=NULL)if(f-data=x)cout data link,x);f f f f 递归找含x值的结点x 问题的解法是递归的问题的解法是递归的 例如,汉诺塔例如,汉诺塔(Tower of Hanoi)问题的解法:问题的解法:如如果果 n=1,则则将将这这一一个个盘盘子子直直接接从从 A 柱柱移移到到 C 柱上。否则,执行以下三步:柱上。否则,执行以下三步:用用 C 柱做过渡,将柱做过渡,将 A 柱上的柱上的(n-
5、1)个盘子移个盘子移 到到 B 柱上:柱上:将将 A 柱上最后一个盘子直接移到柱上最后一个盘子直接移到 C 柱上;柱上;用用 A 柱做过渡,将柱做过渡,将 B 柱上的柱上的(n-1)个盘子移个盘子移 到到 C 柱上。柱上。#include#include strclass.h”void Hanoi(int n,String A,String B,String C)/解决汉诺塔问题的算法 if(n=1)cout move A to C endl;else Hanoi(n-1,A,C,B);cout move A to C endl;Hanoi(n-1,B,A,C);递归过程与递归工作栈递归过程与
6、递归工作栈n n递归过程在实现时,需要自己调用自己。递归过程在实现时,需要自己调用自己。n n层层向下递归,退出时的次序正好相反:层层向下递归,退出时的次序正好相反:递归调用递归调用 n!(n-1)!(n-2)!1!0!=1 返回次序返回次序n n主程序第一次调用递归过程为主程序第一次调用递归过程为外部调用外部调用;n n递归过程每次递归调用自己为递归过程每次递归调用自己为内部调用内部调用。n n它们它们返回返回调用它的过程的调用它的过程的地址地址不同。不同。递归工作栈递归工作栈n n每一次递归调用时,需要为过程中使用的每一次递归调用时,需要为过程中使用的参数、局部变量等另外分配存储空间。参数
7、、局部变量等另外分配存储空间。n n每层递归调用需分配的空间形成递归工作每层递归调用需分配的空间形成递归工作记录,按后进先出的栈组织。记录,按后进先出的栈组织。局部变量局部变量返回地址返回地址参参 数数活动活动记录记录框架框架递归递归工作记录工作记录函数递归时的活动记录函数递归时的活动记录.Function().调用块函数块返回地址(下一条指令)局部变量 参数 long Factorial(long n)int temp;if(n=0)return 1;else temp=n*Factorial(n-1);RetLoc2 return temp;void main()int n;n=Facto
8、rial(4);RetLoc1 计算计算Fact时活动记录的内容时活动记录的内容递递归归调调用用序序列列0 RetLoc21 RetLoc22 RetLoc23 RetLoc24 RetLoc1参数参数参数参数 返回地址返回地址返回地址返回地址 返回时的指令返回时的指令返回时的指令返回时的指令RetLoc1 return 4*6 /返回返回返回返回2424 RetLoc2 return 3*2 /返回返回返回返回6 6 RetLoc2 return 1 /返回返回返回返回1 1 RetLoc2 return 1*1 /返回返回返回返回1 1 RetLoc2 return 2*1 /返回返回返回
9、返回2 2 递归过程改为非递归过程递归过程改为非递归过程n n递归过程简洁、易编、易懂递归过程简洁、易编、易懂n n递归过程递归过程效率低效率低,重复计算多,重复计算多n n改为非递归过程的目的是改为非递归过程的目的是提高效率提高效率n n单向递归单向递归和和尾递归尾递归可直接用可直接用迭代迭代实实现其非递归过程现其非递归过程n n其他情形必须借助其他情形必须借助栈栈实现非递归过实现非递归过程程计算斐波那契数列的函数计算斐波那契数列的函数Fib(n)的定义的定义求解斐波那契数列的递归算法求解斐波那契数列的递归算法 long Fib(long n)if(n=1)return n;else ret
10、urn Fib(n-1)+Fib(n-2);如如 F0=0,F1=1,F2=1,F3=2,F4=3,F5=5 调用次数调用次数 NumCall(k)=2*Fib(k+1)-1斐波那契数列的递归调用树斐波那契数列的递归调用树Fib(1)Fib(0)Fib(1)Fib(2)Fib(3)Fib(4)Fib(1)Fib(0)Fib(2)Fib(1)Fib(0)Fib(1)Fib(2)Fib(3)Fib(5)Fib(1)Fib(0)Fib(2)Fib(1)Fib(0)Fib(2)Fib(1)Fib(3)Fib(4)栈结点栈结点n tagtag=1,向左递归;向左递归;tag=2,向右递归向右递归Fib(
11、1)Fib(0)Fib(2)Fib(1)Fib(0)Fib(2)Fib(1)Fib(3)Fib(4)2 13 14 1 n=1sum=0+12 23 14 1n=2-23 14 1 n=0sum=1+03 24 1n=3-24 1 n=1sum=1+14 2n=4-2Fib(1)Fib(0)Fib(2)Fib(1)Fib(0)Fib(2)Fib(1)Fib(3)Fib(4)2 14 2 n=1sum=2+12 24 2n=2-24 2 n=0sum=3+0long Fibnacci(long n)Stack S;Node*w;long sum=0;/反复执行直到所有终端结点数据累加完 do w
12、hile(n 1)w-n=n;w-tag=1;S.push(w);n-;/向左递归到底,边走边进栈 sum=sum+n;/执行求和 while(!S.IsEmpty()w=S.getTop();S.Pop();if(w-tag=1)/改为向右递归 w-tag=2;S.push(w);n=w-n 2;/F(n)右侧为F(n-2)break;while(!S.IsEmpty();return sum;单向递归用迭代法实现单向递归用迭代法实现long FibIter(long n)if(n=1)return n;long twoback=0,oneback=1,Current;for(int i=2
13、;i=0)cout An=0)cout value An endl;n-;递归与回溯递归与回溯 常用于搜索过程常用于搜索过程n皇后问题皇后问题 在在 n 行行 n 列的列的国际象棋棋盘上,国际象棋棋盘上,若若两个皇后两个皇后位于位于同一行同一行、同一列同一列、同一对角线同一对角线上,则称为它们为上,则称为它们为互相互相攻击攻击。n皇后问题是指皇后问题是指找到这找到这 n 个个皇后的互不攻击的布局皇后的互不攻击的布局。1#主对角线主对角线3#主对角线主对角线5#主对角线主对角线0#次对角线次对角线2#次对角线次对角线4#次对角线次对角线6#次对角线次对角线1#次对角线次对角线3#次对角线次对角线
14、5#次对角线次对角线0#主对角线主对角线2#主对角线主对角线4#主对角线主对角线6#主对角线主对角线0 1 2 3 0123k=i+jk=n+i-j-1解题思路解题思路n n安放安放第第 i 行行皇后时,需要在列的方向从皇后时,需要在列的方向从 0 到到 n-1 试探试探(j=0,n-1)n n在在第第 j 列列安放一个皇后:安放一个皇后:uu如果在如果在列列、主对角线主对角线、次对角线次对角线方向方向有其它皇后,则出现攻击,撤消在有其它皇后,则出现攻击,撤消在第第 j 列列安放的皇后。安放的皇后。uu如果没有出现攻击,在如果没有出现攻击,在第第 j 列列安放的安放的皇后不动,递归安放第皇后不
15、动,递归安放第 i+1行皇后。行皇后。n n设置设置 4 个数组个数组u coln:coli 标识第标识第 i 列是否安放列是否安放了皇后了皇后u md2n-1:mdk 标识第标识第 k 条主对条主对角线是否安放了皇后角线是否安放了皇后u sd2n-1:sdk 标识第标识第 k 条次对角条次对角线是否安放了皇后线是否安放了皇后u qn:qi 记录第记录第 i 行皇后在第几列行皇后在第几列void Queen(int i)for(int j=0;j n;j+)if(第第 i 行第行第 j 列没有攻击列没有攻击)在在第第 i 行第行第 j 列安放皇后列安放皇后;if(i=n-1)输出一个布局输出一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 递归 概念 过程 工作 回溯 广义
限制150内