递推算法思想(3)——汉诺塔问题,阶乘问题

递归算法思想往往通过函数形式实现,所以需要预先编写功能函数。


需注意:
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;
}

猜你喜欢

转载自blog.csdn.net/liuzhioj/article/details/79836294