zoukankan      html  css  js  c++  java
  • 数据-第19课-递归的应用实战一

    第19课-递归的应用实战一

    1. 递归的数学思想

    (1)      递归是一种数学上分而自治的思想。

    (2)      递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理。

    (3)      递归需要有边界条件。

    l  当边界条件不满足时,递归继续进行。

    l  当边界条件满足时,递归停止。

    2 . 递归的数学表示

      n > 1

                n==1

    (1)斐波拉契数列递归解法

    #include <stdio.h>

    int fibonacci(int n)

    {

        if( n > 1 )

        {

            return fibonacci(n-1) + fibonacci(n-2);

        }

        else if( n == 1 )

        {

            return 1;

        }

        else if( n == 0 )

        {

            return 0;

        }

    }

    int main()

    {

        int i = 0;  

        for(i=1; i<=10; i++)

        {

            printf("fibonacci(%d) = %d ", i, fibonacci(i));

        }

        return 0;

    }

    (2)strlen递归解法

    #include <stdio.h>

    int strlen(const char* s)

    {

        if( s == NULL )

        {

            return -1;

        }

        else if( *s == '' )

        {

            return 0;

        }

        else

        {

            return strlen(s+1) + 1;

        }

    }

    int main()

    {

        printf("strlen("12345") = %d ", strlen("12345"));

        printf("strlen(NULL) = %d ", strlen(NULL));

        printf("strlen("") = %d ", strlen(""));

        return 0;

    }

    (3)汉诺塔递归解法

    为了达到这个目的,我们整理一下思路。我们举例有三个。为了将a,b,c。三个桩子上的东西,将a移动到c上(a,b,c),我们首先要做的是将其中的两个,借助c移动到b上(a,c,b)。我们再将剩下的一个直接移动到c。最后借助a将b处的盘子移动到c处(b,a,c)。

    #include <stdio.h>

    void hanoi(int n, char a, char b, char c)

    {

        if( n > 0 )

        {

            if( n == 1 )

            {

                printf("%c -> %c ", a, c);

            }

            else

            {

                hanoi(n-1, a, c, b);

               

                printf("%c -> %c ", a, c);

               

                hanoi(n-1, b, a, c);

            }

        }

    }

    int main()

    {

        hanoi(12, 'a', 'b', 'c'); 

        return 0;

    }

    (4)全排列递归解法

    #include <stdio.h>

    void permutation(char s[], int b, int e)

    {

        if( (0 <= b) && (b <= e) )

        {

            if( b == e )

            {

                printf("%s ", s);

            }

            else

            {

                int i = 0;      

                for(i=b; i<=e; i++)

                {

                    char c = s[b];

                    s[b] = s[i];

                    s[i] = c; 

                    permutation(s, b+1, e);          

                     c = s[b];

                    s[b] = s[i];

                    s[i] = c;

                }

            }

        }

    }

    int main()

    {

        char s[] = "abcd";   

        permutation(s, 0, 3);

        return 0;

    }

    小结

    (1)      递归是一种将问题分而自治的思想。

    (2)      用递归解决问题首先要建立递归的模型。

    (3)      递归解法必须要有边界条件,否则将死循环。

  • 相关阅读:
    JVM Specification 9th Edition (1) Cover
    《数据库设计入门经典》读书笔记——第一章:数据库建模的过去与现在
    Fly (From Wikipedia)
    centos 6.5 安装mysql 5.7.21 community
    数据库设计(七)第三范式(3NF)
    记录一次OOM排查经历(一)
    jpa中时间戳格式应该用哪种类型
    mybatis generator如何定制JavaTypeResolver,使smallint类型的数据库字段在po中的类型为Integer?
    jenkins部署war包到远程服务器的tomcat
    Jenkins踩坑系列--你试过linux主机ssh登录windows,启动java进程吗,来试试吧
  • 原文地址:https://www.cnblogs.com/free-1122/p/11322807.html
Copyright © 2011-2022 走看看