递归包括递推和回归
递归举例: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];//定义动态数组的方法