斐波那契数列动态递归写法

动态递归

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];
	}
}
发布了14 篇原创文章 · 获赞 5 · 访问量 554

猜你喜欢

转载自blog.csdn.net/qq_44116786/article/details/90703006
今日推荐