主要思想:
通过已知的条件(已知结果),利用特定的关系,逐步递推(顺推/逆推),直到有解或者无解。
主要分为两种:
顺推,从已知条件出发,直至推出解。
逆推,从已知结果出发
,直至推出解。
需要注意的:每一递推结果,都是下一步递推的条件。
顺推:
斐波那契数列
F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)
实例
兔子的总数有多少?
一对兔子,每月能生一对,而每对兔子3个月后可以生育。求12个月后共有多少兔子。
#include<stdio.h>
#define NUM 13
void main(){
int i;
long fid[NUM]={1,1};
for(i=2;i<NUM;i++){
fid[i]=fid[i-1]+fid[i-2];
}
for(i=0;i<NUM;i++){
printf("%d月,兔子的总数%d\n",i,fid[i]);
}
getch();
}
分析:首先,可以很明确的知道,这是一个顺推的问题。第一个月1对,第二个月1对,第三个月2对。。。一次次的递推。对于顺推的问题,主要的就是找到最初条件(1,1,2,3。。。)和特定关系(
Fn=F(n-1)+F(n-2)(n>=2,n∈N*)),找到这些,然后根据问题的,进一步完善即可。
程序运行过程分析略。
逆推:
实例
该存多少钱?
要想在大学四年里的最后一个月取生活费1000元,期间每个月取1000元,从一开始,就得存多少钱。银行一年的利率为1.71%。
#include<stdio.h>
#define FETCH 1000 //每个月取1000元
#define RATE 0.0171 //银行的年利率
void main(){
double year[49];//0-48个月
int i;
year[48]=(double)FETCH;
for(i=47;i>0;i--){
year[i]=(year[i+1]+FETCH)/(1+RATE/12);
}
for(i=48;i>0;i--){
printf("%d月的本息和为%.2f\n",i,year[i]);
}
getch();
}
分析:我们知道最后一个月即48月取的钱是1000元,那47月的本息和应该为1000/(1+0.0171/12)。在由47月的本息逆推46月的本息:(1000/(1+0.0171/12)) / (1+0.0171/12),由此类推,直至1月为止。那么这就是一个典型的逆推问题。由结果出发,推出解。
程序运行过程分析略。
递推思想只是简单的算法入门,讲述的也都是一些很基本的东西,不过里面的思维值得慢慢体会和揣摩。在日常的生活中,我们都经常会不自觉的使用到递推的思想。把握知其中的本质:从一个结果,根据特定的条件,推出下一个结果。那么有些复杂的事,就会变得很简单。