美文网首页
递归算法

递归算法

作者: 过气海豹 | 来源:发表于2021-03-25 11:40 被阅读0次

    1.基础概念

    1.一个函数调用其自身,就是递归
    2.递归和普通函数调用一样是通过栈实现的
    3.树与二叉树适合使用递归的形式来表述
    4.算法分为基础步和归纳步

    递归算法的一般性原则

    递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要地信息的保存与回复

    递归能够解决的问题所具有的特征

    (1)问题的描述涉及规模
    (2)问题的规模发生变化后,解决问题的方法完全相同,并且原问题的解由小规模问题的解构成
    (3)小规模的问题是可以求解的(在有限步内可以停机)

    2.典型问题

    1.求阶乘

    输入:n
    输出:n!

    int factorial(int n)
    {
      if(n==0)
        return 1;
      else return n*factorial(n-1); 
    }
    

    2.汉诺塔

    输入:盘子的个数n、柱子的名称a,b,c
    输出:移动方案

    #include<stdio.h>
    
    void hanoi(int n,char a, char b, char c)
    {
        if(n==1)
        printf("%c->%c\n",a,c);
        else 
        {
        hanoi(n-1,a,c,b);
        printf("%c->%c\n",a,c);
        hanoi(n-1,b,a,c);
        }
    }
    int main()
    {
        int n;
        char A='A',B='B',C='C';
        scanf("%d",&n);
        hanoi(n,A,B,C);
        return 0;
    } 
    
    

    3.斐波那契数列

    输入:位数n
    输出:斐波那契数列第n位的值

    int fbnq(int n)
    {
         if(n==1||n==2)
            return 1;
        else
            return fbnq(n-1)+fbnq(n-2);
     } 
    int main()
    {
        int n,re;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
        re = fbnq(i);
        printf("%d ",re);
        }
        return 0;
    }
    

    4.下楼梯

    有n阶楼梯,每次只能下一个或者两个,计算一共有多少种下楼方法

    int xlt(int n)
    {
        if(n==0||n==1)return 1;
        return xlt(n-1)+xlt(n-2)+xlt(n-3);
    }
    

    5.分治算法求n个元素的最大值和最小值

    算法思想:
    1.将n个数均分为s1和s2
    2.分别求解s1和s2的最大值和最小值
    s1最大值为max1,s1最小值为min1
    s2最大值为max2,s2最小值为min2
    3.计算min(min1,min2),max(max1,max2)

     
    void Maxmin(int a[],int l,int r,int &x,int &y)
    {
        if(l==r)///只有一个数的情况
        {
            x=a[l],y=a[l];
            return;
        }
        if(r-l==1)///只有两个数的情况
        {
            if(a[l]<a[r])
            {
                x=a[l],y=a[r];
            }
            else
            {
                x=a[r],y=a[l];
            }
        }
        else
        {
            int mid=(l+r)/2;
            int x1,y1,x2,y2;
            Maxmin(a,l,mid,x1,y1);
            Maxmin(a,mid+1,r,x2,y2);
            x=min(x1,x2);
            y=max(y1,y2);
        }
    }
    

    相关文章

      网友评论

          本文标题:递归算法

          本文链接:https://www.haomeiwen.com/subject/atnwcltx.html