第43课 - 递归的思想与应用(上)

----此节内容于C语言课程已分析过,但递归在----

----后续数据结构课程中使用众多,所以再次----

----分析,加深理解----


1、递归的思想与应用 

            递归是—种数学上分而自治的思想 

                -将原问题分解为规模较小的问题进行处理 

                        分解后的问题与原问题的类型完全相同,但规模较小 

                        通过小规模问题的解,能够轻易求得原问题的解 

            -问题的分解是有限的(递归不能无限进行) 

扫描二维码关注公众号,回复: 1084588 查看本文章

                        当边界条件不满足时,分解问题(递归继续进行) 

                        当边界条件满足时,直接求解(递归结束) 


        递归模型的一般表示法 



        递归在程序设计中的应用 

            -递归函数 

                    函数体中存在自我调用的函数 

                    递归函数必须有递归出口(边界条件) 

                    函数的无限递归将导致程序崩溃 


        递归思想的应用 

            -求解: Sum(n) = 1 + 2 + 3 +…+n 

                    

2、编程实验 

递归求和     unsigned int sum(unsigned int n)
#include <iostream>

using namespace std;

unsigned int sum(unsigned int n)
{
    if(n > 1)
        return n + sum(n - 1);
    else
        return 1;
}

int main()
{
    cout<<sum(100)<<endl;

    return 0;
}

  

      斐波拉契数列 

            -数列自身递归定义: 1, 1, 2, 3, 5, 8, 13, 21, … 

        

3、编程实验 

斐波拉契数列     unsigned int Fibonacci(unsigned int n)
#include <iostream>

using namespace std;

unsigned int fib(unsigned int n)
{
    if(n > 2)
        return fib(n - 1) + fib(n - 2);

    if(n == 1 || n == 2)
        return 1;

    return 0;
}


int main()
{
    for(int i=1;i<10;i++)
     cout<<fib(i)<<endl;

    return 0;
}



            用递归的方法编写函数求字符串长度 

                    

4、编程实验 

递归方法求字符串长度unsigned int strlen(const char* s)
#include <iostream>

using namespace std;

unsigned int _strlen_(const char* s)
{
//    if(*s != '\0')
//        return 1 + _strlen_(s + 1);
//    else
//        return 0;

    return s ? ( *s ? (1 + _strlen_(s + 1)) : 0 ) : 0;
}

int main()
{
    cout<<_strlen_("nyist")<<endl;

    return 0;
}

5、小结 

            递归是一种将问题分而自治的思想

            用递归解决问题首先要建立递归的模型 

            递归解法必须要有边界条件,否则无解 

            不要陷入递归函数的执行细节,学会通过代码描述递归问题 


猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/80394746