动态规划入门与递归

递归包括递推回归

递归举例:Fibonacci数列

#include<iostream>
#include<ctime>
using namespace std;

int fibo(int n)
{
    if (n < 1) return -1;
    else if (n == 1 || n == 2) return 1;
    else if (n > 2) return fibo(n -1) + fibo(n - 2);
}
int main()
{
    int start_time,end_time,total_time;
    int n;
    cin >> n;
    //记录程序开始时间
    start_time = clock();
    cout << fibo(n) << endl;
    //记录程序结束时间
    end_time = clock();
    total_time = end_time - start_time;
    cout << total_time << endl;
    return 0;
}

 以上递归代码是经典的递归写法,代码执行结果如下:

 

 但是,当n输入50或100时,程序可能会执行很长的时间,原因是递归程序重复计算了很多相同的结果。有兴趣的读者可以自己尝试。那么有没有一种方法,可以减少计算    Fibonacci数列第n项的时间呢?

答案当然是有的,参考如下代码,代码思想即为动态规划

#include<iostream>
#include<ctime>
#include<iomanip>
using namespace std;

long double fibo2(int n)
{
    long double temp;
    if (n < 1) return -1;
    long double *a = new long double[n + 1];//定义一个长度为n + 1的动态数组
    a[1] = a[2] = 1;
    for (int i = 3;i <= n;i++)
    {
        a[i] = a[i - 1] + a[i - 2];
    }
    temp = a[n];//将Fibonacci数列的第n项存在一个变量之中
    delete []a; //删除定义的数组
    return temp;
}
int main()
{
    int start_time,end_time,total_time;
    int n;
    cin >> n;
    start_time = clock();                    //记录程序开始时间
    cout << fixed << setprecision(0);        //输出格式不使用科学计数法
    cout << fibo2(n) << endl;                //执行递归程序
    end_time = clock();                      //记录程序结束时间
    total_time = end_time - start_time;
    cout << total_time << endl;
    return 0;
}

 这样就可以尝试输出Fibonacci数列的第100项了

 

知识点:

*a代表的是来c语言中的指针,意思就是一段内存空间,new int()是指开辟的是能够放入int类型数据的内存空间

int n;

cin >> n;

int *a = new int [n];//定义动态数组的方法 

猜你喜欢

转载自blog.csdn.net/smallrain6/article/details/106029294