动态递归
1.什么是动态递归
动态递归是一种用来解决一类最优化问题的思想,动态递归将复杂的问题分解成若干个子问题,通过综合子问题的最优解来得到原问题的最优解。需要注意的是,动态递归会将每个求解过的子问题的解记录下来,这样当下一次遇到同样的子问题时,就可以直接使用之前记录的结果,而不是重复计算。
一般可以使用递归或者递推的写法来实现动态规划,其中递归写法在此处又称作记忆化搜索
2.斐波那契数列动态递归写法
2.1一般写法
一般我们会写出如下的代码来实现斐波那契数列的求解,事实上,这个递归会涉及到很多重复的计算,例如当n==6时F(6) = F(5) + F(4) ,当n等于5时F(5) = F(4) + F(3) ,可以推知当n很大时,重复计算的次数将难以想象。
#include<iostream>
using namespace std;
int F(int n){
if(n==0||n==1) return 1;
else return F(n-1) + F(n-2);
}
int main(){
int n;
cin>>n;
cout<<F(n)<<endl;
return 0;
}
2.2动态递归写法
int F(int n){
if(n==0||n==1) return 1;//递归边界
if(q[n]!=-1) return q[n]; //用于保存已经计算过的结果,其中的每个数组值初始化为-1
else{
q[n] = F(n-1) + F(n-2);
return q[n];
}
}