zoukankan      html  css  js  c++  java
  • 递归

    递归

      定义:一个函数自己直接或者间接调用自己

      递归满足的三个条件:

        1.  递归必须有终止条件

        2.  该函数所处理的数据规模必须在递减

        3.  这个转化必须是可解的

      循环和递归

        所有的循环都可以转化为递归,递归不一定都可以转化为循环

       递归: 易于理解, 速度慢, 存储空间大

       循环: 不易理解, 速度快, 存储空间小

     汉诺塔:这不是线性递归,是一个非线性递归

    n=1         1

    n=2          3

    n=3          7

    ................

    ................

    n=64           2的64次方减1【这是个天文数字,就算世界上最快的计算机也解决不了】

    汉诺塔的复杂度是2的n次方减一

    问题很复杂,但真正解决问题的编码就只有三句

    #include <stdio.h>
    
    int hannuota(int n, char A, char B, char C)
    {
        /*如果是一个盘子
            直接将A柱子上的盘子从A移到C
        否则
            先将A柱子上的n-1个盘子借助C移到B
            直接将A柱子上的一个盘子从A移到C
            最后将B柱子上的n-1个盘子借助A移到C*/
        if(n==1)
            printf("将编号为%d的盘子直接从%c柱子移到%c柱子
    ", n, A, C);
        else
        {
            hannuota(n-1,A,C,B);
            printf("将编号为%d的盘子直接从%c柱子移动到%c柱子
    ", n, A, C);
            hannuota(n-1,B,A,C);
        }
    
    }
    int main()
    {
        char ch1 = 'A';
        char ch2 = 'B';
        char ch3 = 'C';
        int n;
    
        printf("请输入要移动的盘子的个数: ");
        scanf("%d", &n);
    
        hannuota(n, 'A', 'B', 'C');
    
        return 0;
    }

    用递归求阶乘

    #include <stdio.h>
    
    int f(int n)
    {
        if(n==1)
            return 1;
        else
            return f(n-1)+n;
    }
    int main()
    {
        printf("%d",f(5));
        return 0;
    }

    用递归求1+2+3+4+5......+100=

    #include <stdio.h>
    
    int sum(int n)
    {
        if(n==1)
            return 1;
        else
            return sum(n-1)+n;
    }
    int main()
    {
     int n;
     scanf("%d",&n);
     printf("%d",sum(n));
     return 0;
    }
  • 相关阅读:
    排列专题(不定期更新)
    搜索专题(不定期更新)
    Redis 高级面试题
    面试题1
    CentOS7查看开放端口命令及开放端口号
    Union和Union All到底有什么区别
    浅谈MySQL中优化sql语句查询常用的30种方法
    什么是分布式系统,如何学习分布式系统(转)
    浅析分布式系统(转)
    什么是分布式系统(通俗易懂的说法)(转)
  • 原文地址:https://www.cnblogs.com/spore/p/11088134.html
Copyright © 2011-2022 走看看