版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、求解阶乘函数的递归算法求解阶乘函数的递归算法long Factorial ( long n ) if ( n = 0 ) return 1; else return n * Factorial (n-1);时时当当时时当当 1 ,)!1( 0 , 1!nnnnn参数参数 4 计算计算 4*fact(3) 前往前往 24参数参数 3 计算计算 3*fact(2) 前往前往 6参数参数 2 计算计算 2*fact(1) 前往前往 2参数参数 1 计算计算 1*fact(0) 前往前往 1参数参数 0 直接定值直接定值 = 1 前往前往 1f f f f f f f a0a1a2a3a4递归找链尾f
2、 f f f 递归找含x值的结点x 用用 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 CA,B,C(1,A,C,B)A,B,CA-CA-C(1,B,A,C)A,B,CA-CA-BA-B
3、A-CB-CC-BA-C(2,B,A,C)A,B,C(1,A,C,B)A,B,CA-CA-C(1,B,A,C)A,B,CA-CB-CA-BB-AB-CA-C递归递归工作记录工作记录.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 = Factorial (4); RetLoc1 0 1 RetLoc21 1 RetLoc22 2 Ret
4、Loc23 6 RetLoc24 24 RetLoc1return 4*6 /前往前往 24 return 3*2 /前往前往 6 return 1 /前往前往 1 return 1*1 /前往前往 1 return 2*1 /前往前往 2 1n2),Fib(n1)Fib(n0,1nn,)Fib(n斐波那契数列的递归调用树斐波那契数列的递归调用树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)
5、Fib(1)Fib(3)Fib(4)n tagtag = 1, 向左递归;向左递归;tag = 2, 向右递归。向右递归。Fib(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
6、Fibnacci ( long n ) Stack S; Node w; long sum = 0; /反复执行直到所有终端结点数据累加完反复执行直到所有终端结点数据累加完 do while ( 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.
7、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; i = 0 ) cout An = 0 ) cout value An endl; n-; 对一个包含有许多结点,且每个结点有多对一个包含有许多结点,且每个结点有多个分支的问题,可以先选择一个分支进行个分支的问题,可以先选择一个分支进行搜索。当搜索到某一结点,发现无法
8、再继搜索。当搜索到某一结点,发现无法再继续搜索下去时,可以沿搜索路径回退到前续搜索下去时,可以沿搜索路径回退到前一结点,沿另一分支继续搜索。一结点,沿另一分支继续搜索。 如果回退之后没有其他选择,再沿搜索路如果回退之后没有其他选择,再沿搜索路径回退到更前结点,径回退到更前结点,。依次执行,直到。依次执行,直到搜索到问题的解,或搜索完全部可搜索的搜索到问题的解,或搜索完全部可搜索的分支没有解存在为止。分支没有解存在为止。 回溯法与分治法本质相同,可用递归算法回溯法与分治法本质相同,可用递归算法求解。求解。1#主对角线主对角线3#主对角线主对角线5#主对角线主对角线0#次对角线次对角线2#次对角线
9、次对角线4#次对角线次对角线6#次对角线次对角线1#次对角线次对角线3#次对角线次对角线5#次对角线次对角线0#主对角线主对角线2#主对角线主对角线4#主对角线主对角线6#主对角线主对角线0 1 2 3 0123k = i+jk = n+i-j-1void Queen( int i ) for ( int j = 0; j n; j+ ) if ( 第第 i 行第行第 j 列没有攻击列没有攻击 ) 在第在第 i 行第行第 j 列安放皇后;列安放皇后; if ( i = n-1 ) 输出一个布局;输出一个布局; else Queen ( i+1 ); 撤消第撤消第 i 行第行第 j 列的皇后;列
10、的皇后; /*在第在第 i 行第行第 j 列安放皇后列安放皇后*/ if ( i = n-1 ) /*输出一个布局输出一个布局*/ for ( k = 0; k n; k+ ) cout qk ,; cout endl; else Queen ( i+1 ); colj = mdn+i-j-1 = sdi+j = 0; qi = 0; /*撤消第撤消第 i 行第行第 j 列的皇后列的皇后*/ 路口 动作 结果 1 (入口) 正向走 进到 2 2 左拐弯 进到 3 3 右拐弯 进到 4 4 (堵死) 回溯 退到 3 3 (堵死) 回溯 退到 2 2 正向走 进到 5 5 (堵死) 回溯 退到 2
11、 2 右拐弯 进到 6 6 左拐弯 进到 7 (出口) 6 左 0 直 2 右 0 行 3 行 5 行 6 0 0 4 0 0 0 0 0 0 7 0 0 7迷宫的类定义迷宫的类定义#include #include #include #include #include #include class Maze class Maze private:private: int MazeSize; int MazeSize; int EXIT; int EXIT; Intersection Intersection * *intsec;intsec;public:public: Maze ( cha
12、r Maze ( char * *filename );filename ); int TraverseMaze ( int int TraverseMaze ( int CurrentPos );CurrentPos ); Maze : Maze ( char *filename ) /构造函数:从文件 filename 中读取各路口/和出口的数据 ifstream fin; fin.open ( filename, ios:in | ios:nocreate ); /为输入打开文件,文件不存在则打开失败 if ( !fin ) cerr “迷宫数据文件” filename “打不开” Ma
13、zeSize; /输入迷宫路口数 intsec = new IntersectionMazeSize+1; /创建迷宫路口数组创建迷宫路口数组 for ( int i = 1; i intseci.left intseci.forward intseci.right; fin EXIT; /输入迷宫出输入迷宫出口口 fin.close ( );迷宫漫游与求解算法迷宫漫游与求解算法int Maze:TraverseMaze ( int CurrentPos ) if ( CurrentPos 0 ) /路口从路口从 1 开场开场 if ( CurrentPos = EXIT ) /出口处理出口处
14、理 cout CurrentPos ; return 1; else /递归向左搜寻可行递归向左搜寻可行 if (TraverseMaze(intsecCurrentPos.left ) cout CurrentPos “ ”; return 1; else /递归向前搜寻可行递归向前搜寻可行 if (TraverseMaze(intsecCurrentPos.forward) cout CurrentPos “ ”; return 1; else /递归向右搜寻可行递归向右搜寻可行 if (TraverseMaze(intsecCurrentPos.right) cout CurrentPo
15、s utype = 0; first-ref = 0; first-tlink = NULL;Items GenList : Head ( ) /若广义表非空,则返回其第一个元素的值,/否则函数没有定义。 if ( first-tlink = NULL ) return NULL; else /非空表 Items temp; temp.utype = frist-tlink-utype; temp.value = frist-tlink-value; return temp; /返回类型及值 GenList GenList : Tail ( ) /若广义表非空,则返回广义表除第一个元/素外其它
16、元素组成的表, 否则函数没有定义 if ( frist-tlink = NULL ) return NULL; GenList temp; temp.first = new GenListNode; temp.first-utype = 0; temp.first-value.ref = 0; temp.first-tlink = Copy ( first-tlink-tlink); return temp; GenListNode * GenList : First ( ) if ( first-tlink = NULL ) return NULL; else return first-tl
17、ink;GenListNode * GenList : Next ( GenListNode *elem ) if ( elem-tlink = NULL ) return NULL; else return elem-tlink;GenList& GenList : Addon ( GenList& list, Items x ) /返回一个以x为头,list为尾的新广义表 GenList * newlist; newlist-first = new GenListNode; newlist-first-utype = 0; newlist-first-value.ref =
18、 0; newlist-first-tlink = Copy ( list.first ); newlist-first-tlink-setInfo (x); /将list的表头结点改为newlist的head结点 return newlist; void GenList : Push ( GenListNode& x ) /将表结点将表结点 x 加到表的最前端加到表的最前端 if ( first-tlink = NULL ) first-tlink = x; else x-tlink = first-tlink; first-tlink = x; GenListNode* GenLi
19、st : Copy ( GenListNode * ls ) /私有函数私有函数GenListNode *q = NULL; if ( ls != NULL ) q = new GenListNode ( ls-utype, NULL ); switch ( ls-utype ) case 0: q-value.ref = ls-value.ref; break; case 1: grinfo = grinfo; break; case 2: q-value.charinfo = ls-value.charinfo; break; case 3:
20、q-value.hlink = Copy (ls-value.hlink); q-tlink = Copy (ls-tlink); return q;求广义表的深度求广义表的深度1111234int GenList : depth ( GenListNode *ls ) if ( ls-tlink = NULL ) return 1; /空表空表 GenListNode * temp = ls-tlink; int m = 0; while ( temp != NULL ) /在表顶层横扫在表顶层横扫 if ( temp-utype = 3 ) /结点为表结点结点为表结点 int n = de
21、pth ( temp-value.hlink ); if ( m tlink; return m+1;int GenList : depth ( ) return depth ( first );0 11 5331 2 0 12 x 0 10 12 y32 x void delvalue(GenListNode * ls, const value x) /在广义表中删除所有含在广义表中删除所有含 x 的结点的结点 if ( ls-tlink != NULL ) /非空表非空表 GenListNode * p = ls-tlink; while ( p != NULL & /横扫链表 (
22、 ( p-utype = 1 & info = x ) | ( p-utype = 2 & p-value.charinfo = x ) ) ls-tlink = p-tlink; delete p; /删除 p = ls-tlink; /指向同一层后继结点 if ( p != NULL ) if ( p-utype = 3 ) /在子表中删除 delvalue ( p-value.hlink, x ); delvalue ( p, x ); /在后续链表中删除 GenList : GenList ( ) /析构函数 Remove ( first ); d
23、elete (first);void GenList : Remove ( GenListNode *ls ) /私有函数:释放以 ls 为表头指针的广义表 ls-value.ref -; /引用计数减1 if ( ls-value.ref tlink != NULL ) q = ls-tlink; /到第一个结点到第一个结点 if ( q-utype = 3 ) /递归删除子表递归删除子表 Remove ( q-value.hlink ); if ( q-value.hlink-value.ref value.hlink; ls-tlink = q-tlink; delete q; 从字符串
24、从字符串s 建立广义表的链表表示建立广义表的链表表示 lsint Genlist :CreateList ( GenListNode *ls, char * s ) char *sub, *hsub; int tag; ls = new GenListNode ( ); /建立表头结点建立表头结点 ls-utype = HEAD; ls-value.ref = 1; if ( strlen (s) = 0 | !strcmp ( s,( ) ) ) ls-tlink = NULL; /空表空表 else strncpy ( sub, s+1, strlen (s)-2 ); /脱去广义表外面的引号脱去广义表外面的引号 GenListNode* p = ls; while ( strlen (sub) != 0 ) /建立表结点 p = p-tlink = new GenListNode ( ); /创建新结点,向表尾链接 if ( sever ( sub, hsub ) ) /以逗号为界,分离第一个表元素hsub if ( hsub0 != ( & hsub0 != 0 ) /非子表,非字符分界符 p-utype = INTGR; /转换整型结点 grinfo = atoi ( hsub ); else if ( hsub0 != (
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电机操作中的风险评估与安全管理
- 智能硬件如何塑造未来办公环境
- 2025年泸州a2货运资格证考试题
- 科技研发实验室的预算规划及执行
- 二零二五年度财务合规审查专家劳动合同
- 2025年度房地产开发项目私人用水合同协议书
- 小学数学课堂管理技巧与策略研究
- 2025年度铁矿承包工程矿产资源开发与承包合同
- 2025年度国际码头租用合同及货物装卸服务协议
- 现代办公楼内学生餐厅的设计与实践
- 中国储备粮管理集团有限公司兰州分公司招聘笔试真题2024
- 第1课 隋朝统一与灭亡 课件(26张)2024-2025学年部编版七年级历史下册
- 【历史】唐朝建立与“贞观之治”课件-2024-2025学年统编版七年级历史下册
- 产业园区招商合作协议书
- 2024年广东省公务员录用考试《行测》真题及答案解析
- 2024公路工程施工安全风险辨识与管控实施指南
- 新疆2024年新疆和田师范专科学校招聘70人笔试历年典型考题及考点附答案解析
- 【正版授权】 ISO 15978:2002 EN Open end blind rivets with break pull mandrel and countersunk head - AIA/St
- 2024时事政治考试题库(基础题)
- 2024山西文旅投资集团招聘117人公开引进高层次人才和急需紧缺人才笔试参考题库(共500题)答案详解版
- 《社区康复》课件-第七章 脑瘫患儿的社区康复实践
评论
0/150
提交评论