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

  • 相关阅读:
    【NOIP2015四校联训Day7】 题 题解(Tarjan缩点+DFS)
    【NOIP2013】火柴排队 题解(贪心+归并排序)
    【AHOI2009】中国象棋 题解(线性DP+数学)
    【HDU5869】 Different GCD Subarray Query 题解 (线段树维护区间GCD)
    【FZYZOJ】愚人节礼物 题解(状压DP)
    JavaSE 基础 第12节 基本算术运算符与模运算符
    JavaSE 基础 第11节 深入理解字符串
    JavaSE 基础 第09节 赋值与初始化
    JavaSE 基础 第08节 数据类型转换
    JavaSE 基础 第07节 变量和常量
  • 原文地址:https://www.cnblogs.com/free-1122/p/11322807.html
Copyright © 2011-2022 走看看