




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 求解阶乘函数的递归算法求解阶乘函数的递归算法 long Factorial ( long n ) if ( n = 0 ) return 1; else return n * Factorial (n-1); 时时当当 时时当当 1 ,)!1( 0 , 1 ! n n nn 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
2、f f template void Print ( ListNode *f ) if ( f -link = NULL ) cout data link ); f f f f f a0a1a2a3a4 递归找链尾 template void Print ( ListNode *f, Type f f f f 递归找含x值的结点 x #include #include strclass.h” void Hanoi (int n, String A, String B, String C) /解决汉诺塔问题的算法 if ( n = 1 ) cout move A to C endl; else H
3、anoi ( n-1, A, C, B ); cout move A to C -C A,B,C (1,A,C,B) A,B,C A-C A-C (1,B,A,C) A,B,C A-C A-B A-B A-C B-C C-B A-C (2,B,A,C) A,B,C (1,A,C,B) A,B,C A-C A-C (1,B,A,C) A,B,C A-C B-C A-B B-A B-C A-C 递归递归 工作记录工作记录 . Function() . 调用块 函数块 long Factorial ( long n ) int temp; if ( n = 0 ) return 1; else te
4、mp = n * Factorial (n-1); RetLoc2 return temp; void main ( ) int n; n = Factorial (4); RetLoc1 0 1 RetLoc2 1 1 RetLoc2 2 2 RetLoc2 3 6 RetLoc2 4 24 RetLoc1 return 4*6 / return 3*2 / return 1 / return 1*1 / return 2*1 / long Fib ( long n ) if ( n = 1 ) return n; else return Fib (n-1) + Fib (n-2); 1n2
5、),Fib(n1)Fib(n 0,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) Fib(1) Fib(3) Fib(4) n tag tag = 1, 向左递归;向左递归;tag = 2, 向右递归。向右递归。 Fib(1)Fib(0) Fib(2)Fib(1)Fib(0) Fib(2)
6、Fib(1) Fib(3) Fib(4) 2 1 3 1 4 1 n=1 sum=0+1 2 2 3 1 4 1 n=2-2 3 1 4 1 n=0 sum=1+0 3 2 4 1 n=3-2 4 1 n=1 sum=1+1 4 2 n=4-2 Fib(1)Fib(0) Fib(2)Fib(1)Fib(0) Fib(2) Fib(1) Fib(3) Fib(4) 2 1 4 2 n=1 sum=2+1 2 2 4 2 n=2-2 4 2 n=0 sum=3+0 long Fibnacci ( long n ) Stack S; Node w; long sum = 0; /反复执行直到所有终端
7、结点数据累加完 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.n 2; /F(n)右侧为F(n-2) break; while ( !S.IsEmpty( ) ); return sum; long FibIter ( long n ) if ( n
8、 = 1 ) return n; long twoback = 0, oneback = 1, Current; for ( int i = 2; i = 0 ) cout An = 0 ) cout value An endl; n-; 对一个包含有许多结点,且每个结点有多对一个包含有许多结点,且每个结点有多 个分支的问题,可以先选择一个分支进行个分支的问题,可以先选择一个分支进行 搜索。当搜索到某一结点,发现无法再继搜索。当搜索到某一结点,发现无法再继 续搜索下去时,可以沿搜索路径回退到前续搜索下去时,可以沿搜索路径回退到前 一结点,沿另一分支继续搜索。一结点,沿另一分支继续搜索。 如果回
9、退之后没有其他选择,再沿搜索路如果回退之后没有其他选择,再沿搜索路 径回退到更前结点,径回退到更前结点,。依次执行,直到。依次执行,直到 搜索到问题的解,或搜索完全部可搜索的搜索到问题的解,或搜索完全部可搜索的 分支没有解存在为止。分支没有解存在为止。 回溯法与分治法本质相同,可用递归算法回溯法与分治法本质相同,可用递归算法 求解。求解。 1#主对角线主对角线 3#主对角线主对角线 5#主对角线主对角线 0#次对角线次对角线 2#次对角线次对角线 4#次对角线次对角线 6#次对角线次对角线 1#次对角线次对角线 3#次对角线次对角线 5#次对角线次对角线 0#主对角线主对角线 2#主对角线主对
10、角线 4#主对角线主对角线 6#主对角线主对角线 0 1 2 3 0 1 2 3 k = i+j k = n+i j- -1 u u u u void Queen( int i ) for ( int j = 0; j n; j+ ) if ( ) ; if ( i = n-1 ) ; else Queen ( i+1 ); ; void Queen( int i ) for ( int j = 0; j n; j+ ) if ( !colj qi = j; /*在在第第 i 行第行第 j 列安放皇后列安放皇后*/ if ( i = n-1 ) for ( k = 0; k n; k+ ) c
11、out qk ,; cout endl; else Queen ( i+1 ); colj = mdn+i-j-1 = sdi+j = 0; qi = 0; 路口路口 动作动作 结果结果 (入口入口) 正向走正向走 进到进到 左拐弯左拐弯 进到进到 右拐弯右拐弯 进到进到 (堵死堵死) 回溯回溯 退到退到 (堵死堵死) 回溯回溯 退到退到 正向走正向走 进到进到 (堵死堵死) 回溯回溯 退到退到 右拐弯右拐弯 进到进到 左拐弯左拐弯 进到进到 (出口出口) 左左 直直 右右 行行 行行 行行 迷宫的类定义迷宫的类定义 #include #include #include class Maze
12、private: int MazeSize; int EXIT; Intersection *intsec; public: Maze ( char * ); int TraverseMaze ( int CurrentPos ); struct Intersection int left; int forward; int right; Maze : Maze ( char * ) /构造函数:从文件 中读取各路口 /和出口的数据 ifstream fin; fin.open ( , ios:in | ios:nocreate ); /为输入打开文件,文件不存在则打开失败 if ( !fin
13、 ) cerr “迷宫数据文件” “打不开” MazeSize; /输入迷宫路口数 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 ) /出口处理 cout CurrentP
14、os ; 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 CurrentPos utype = 0; first-ref = 0; first-tlink = NUL
15、L; 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 ( ) /若广义表非空,则返回广义表除第一个元 /素外其它元素组成的表, 否则函数没有定义 if ( frist-tlink = NULL )
16、 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-tlink; GenListNode * GenList : Next ( GenLis
17、tNode *elem ) if ( elem-tlink = NULL ) return NULL; else return elem-tlink; GenList newlist-first = new GenListNode; newlist-first-utype = 0; newlist-first-value.ref = 0; newlist-first-tlink = Copy ( list.first ); newlist-first-tlink-setInfo (x); /将list的表头结点改为newlist的head结点 return newlist; void GenL
18、ist : Push ( GenListNode else x-tlink = first-tlink; first-tlink = x; void GenList : Copy ( const GenList /共有函数 GenListNode* GenList : 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.r
19、ef; break; case 1: grinfo = grinfo; break; case 2: q-value.charinfo = ls-value.charinfo; break; case 3: q-value.hlink = Copy (ls-value.hlink); q-tlink = Copy (ls-tlink); return q; 求广义表的深度求广义表的深度 1111 2 3 4 int GenList : depth ( GenListNode *ls ) if ( ls-tlink = NULL ) return 1
20、; /空表 GenListNode * temp = ls-tlink; int m = 0; while ( temp != NULL ) /在表顶层横扫 if ( temp-utype = 3 ) /结点为表结点 int n = depth ( temp-value.hlink ); if ( m tlink; return m+1; int GenList : depth ( ) return depth ( first ); 0 11 5331 2 0 12 x 0 1 0 12 y3 2 x void delvalue(GenListNode * ls, const value x)
21、 /在广义表中删除所有含 x 的结点 if ( ls-tlink != NULL ) /非空表 GenListNode * p = ls-tlink; while ( p != NULL delete p; /删除 p = ls-tlink; /指向同一层后继结点 if ( p != NULL ) if ( p-utype = 3 ) /在子表中删除 delvalue ( p-value.hlink, x ); delvalue ( p, x ); /在后续链表中删除 GenList : GenList ( ) /析构函数 Remove ( first ); delete (first); v
22、oid 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; 从字符串从字符串s 建立广义表的链表表示建立广义表的链表表示
23、ls int 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 GenList
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数字化转型在农业电商中的实现试题及答案
- 数学应急考试试题及答案
- 家具材料选择的重要性研究试题及答案
- 黄埔数学面试真题及答案
- 短视频平台内容监管与2025年社会责任责任评价体系研究报告
- 施工现场电气安全隐患题目及答案
- 磁学实验考试题及答案
- 新能源汽车行业技术考试内容解析与试题答案
- 新能源汽车售后服务体系发展试题及答案
- 教师宝典考试题及答案
- (市质检)莆田市2025届高中毕业班第四次教学质量检测试卷语文试卷(含答案解析)
- 瓷砖空鼓装修合同协议
- 中职生职业生涯课件
- 烟台2025年烟台市蓬莱区“蓬选”考选90人笔试历年参考题库附带答案详解
- 2025年浙江省生态环境厅所属事业单位招聘考试备考题库
- 入团考试测试题及答案
- 【语文试卷+答案 】上海市崇明区2025届高三第二学期第二次模拟考试(崇明二模)
- 化妆品公司生产部奖惩管理制度
- 家长近视防控课件
- 2025年河北省唐山市玉田县第三中学中考一模地理试卷(含答案)
- 完形填空 20篇 集训-2025年译林版七年级英语下册寒假预习(含答案)
评论
0/150
提交评论