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;
    }
  • 相关阅读:
    help python(查看模块帮助文档)
    Vim常用快捷键
    tar 解压缩
    目前的学习计划
    学习方向
    C#转Python计划
    困惑的屌丝,求方向。。。
    修改PYTHONPATH的一种方法(在Window平台和Ubuntu下都有效)
    使用正则表达式统计vs项目代码总行数[转]
    日常工作细节汇总
  • 原文地址:https://www.cnblogs.com/spore/p/11088134.html
Copyright © 2011-2022 走看看