递归算法思想往往通过函数形式实现,所以需要预先编写功能函数。 需注意: 1.在过程中或函数中调用自身的过程。2.必须有明确的递归结束条件。3.虽然简洁但是运行效率低。4.调用过程中系统用栈来储存每一层的返回点和局部变量,如果次数过多会造成栈溢出。5.不提倡。 用递归算法解决实际问题 (1)汉诺塔问题 诺塔来源及应用 编辑 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。 以三个盘子为例分析:即需要依次将第一个柱子上的前两个盘子放在第二个柱子上,再将第一个柱子上的第三个盘子放在第三个柱子上,再将第二个柱子上的盘子依次放在第三个柱子上,第二步中既需要另一个人按照前一个人的而步骤进行放置。即完成。依次类推64个在第一个柱子上 要求始终保持大盘在下,小盘在上 代码如下: #include <stdio.h> #include <stdlib.h> int move(int h,int x,int y,int z) { if(h==1) printf("%c-->%c\n",x,z); else { move(h-1,x,z,y);//由上一步x->z其中z中有了一个假设三个第一步一个的应该在中间 printf("%c-->%c\n",x,z);//将第一个柱子上的第二个盘子放在中间 { getchar(); }//加用以便观看过程 move(h-1,y,x,z);//同上 } int main() { int h; printf("输入有几个盘子:"); scanf("%d",&h); printf("移动%2d盘子的步骤:\n",h); move(h,'a','b','c'); system("pause"); } (2)阶乘问题 自然数由1~n的n个数的连乘,记作n! 分析:例如求3的阶乘。1*2*3=?其中0!=1. 记f(1)=1!; 1*2=f(1)*2;记f(2)=2!; 1*2*3=f(2)*3;记f(3)=3!当要求n的阶乘是 计算公式是 n*f(n-1); 代码如下: #include <stdio.h> #include <stdlib.h> int fac(int n) { if(n==1) return 1; else return n*fac(n-1); } int main() { int n; printf("输入要计算的阶乘数"); scanf("%d",&n); printf("输出结果:%d\n",fac(n)); return 0; }
递推算法思想(3)——汉诺塔问题,阶乘问题
猜你喜欢
转载自blog.csdn.net/liuzhioj/article/details/79836294
今日推荐
周排行