• 【C语言编程基础】递归算法小结


    1.递归算法思想

    递归即程序反复调用自身。解决递归问题,关键是找到递归公式边界条件。

    2.简单示例

    2.1使用递归公式求1+2+3+....+n的和。

    #include <stdio.h>
    int getsum(int n)
    {
        if(n==1)
        {
           return 1;    
        }     
        return n+getsum(n-1);
    } 
    
    int main()
    {
        printf("使用递归函数求1+..+100的和=%d",getsum(100));
        return 0;
    }

    运行结果:递归公式n+getsum(n-1),边界条件是n==1,return 1;

    2.2甲说比乙大2岁,乙说比丙大3岁,丙说比丁大1岁,丁说自己是18岁,求甲是多少岁?

    #include <stdio.h>
    
    /*甲说比乙大2岁,乙说比丙大3岁,丙说比丁大1岁,丁说自己是18岁,求甲是多少岁?*/
    /*
    分3种情况讨论,假设n=4是甲,n=3是乙,n=2是丙,n=1是丁 
    */
    int getAge(int n)
    {
        if(n==1)
        {
           return 18;    
        } 
        if(n==2)
        {
          return getAge(1)+1;    
        } 
        if(n==3)
        {
          return getAge(2)+3;    
        } 
        if(n==4)
        {
          return getAge(3)+2;    
        } 
    } 
    
    
    int main()
    {
    
        printf("甲的年龄为%d
    ",getAge(4));
        printf("乙的年龄为%d
    ",getAge(3));
        printf("丙的年龄为%d
    ",getAge(2));
        printf("丁的年龄为%d
    ",getAge(1));
        return 0;
    }

    运行结果:

     2.3打印斐波那契数列的前15项

    #include <stdio.h>
    int  Fibonacci(int n)
    {
        if(n==1||n==2)
        {
           return 1;    
        }     
        return Fibonacci(n-1)+Fibonacci(n-2);
    } 
    
    int main()
    {
        printf("求斐波那契数列的前15项:
    ");
        int i=1;
        for(i=1;i<=15;i++)
        {
            printf("(%d)=%d ",i,Fibonacci(i));
         } 
        
        return 0;
    }

    运行结果:

     3.汉诺塔游戏

         汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

    小游戏网址:http://www.hannuota.cn/ 

    详见:汉诺塔的图解递归算法 https://dmego.me/2016/10/16/hanoi

     C语言版本如下:

     #include <stdio.h>
     
     static int m=0;//记录移动次数 
     //实现移动的函数
        void move(int disks,char N,char M)
        {
            printf("把%d号圆盘从%c ->移到->%c
    ",disks,N,M);  
            m++;
        }
     
     //递归实现汉诺塔的函数
        void hanoi(int n,char A,char B,char C)
        {
            if(n == 1)//圆盘只有一个时,只需将其从A塔移到C塔
                move(1, A, C);//将编b号为1的圆盘从A移到C
            else
            {
                hanoi(n - 1, A, C, B);//递归,把A塔上编号1~n-1的圆盘移到B上,以C为辅助塔
                move(n, A, C);//把A塔上编号为n的圆盘移到C上
                hanoi(n - 1, B, A, C);//递归,把B塔上编号1~n-1的圆盘移到C上,以A为辅助塔
            }
        }
        
        int main()
        {
            char A = 'A';
            char B = 'B';
            char C = 'C';
            int disks=0;
            printf("******************************************************************************************
    ");
            printf("这是汉诺塔问题(把A塔上编号从小号到大号的圆盘从A塔通过B辅助塔移动到C塔上去
    ");
            printf("******************************************************************************************
    ");
            printf("请输入圆盘的个数:
    ");
            scanf("%d",&disks);
            hanoi(disks, A, B, C);
            printf(">>移动了%d次,把A上的圆盘都移动到了C上
    ",m);
            return 0;
        }

    运行结果:

    参考文章:

    https://www.cnblogs.com/protectione055/p/11828604.html

    https://www.cnblogs.com/king-lps/p/10748535.html

     https://blog.csdn.net/sinat_38052999/article/details/73303111

    https://dmego.me/2016/10/16/hanoi/

    转载文章链接已标明,如有侵权请告知。文章仅作为知识记忆所用,如有错误,敬请指正。
  • 相关阅读:
    STL next_permutation 全排列
    日期问题
    兰顿蚂蚁
    矩阵翻硬币
    数学问题-排列组合
    h5css3_03练习
    h5css3_03
    h5css3_02练习
    h5css3_02
    h5c3_01练习
  • 原文地址:https://www.cnblogs.com/YorkZhangYang/p/14023180.html
Copyright © 2020-2023  润新知