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

动态递归

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];
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值