• 数据-第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)      递归解法必须要有边界条件,否则将死循环。

  • 相关阅读:
    Linux下的MySQL主从同步
    人不能同时在两个地方做猪(Scrum Team)
    memcache安装
    Java开发中的Memcache原理及实现
    linux mv
    nginx
    idea 热部署
    vue watch
    vue入门
    基于vue-cli快速构建
  • 原文地址:https://www.cnblogs.com/free-1122/p/11322807.html
Copyright © 2020-2023  润新知