算法入门——递推

主要思想:
    通过已知的条件(已知结果),利用特定的关系,逐步递推(顺推/逆推),直到有解或者无解。

    主要分为两种:顺推,从已知条件出发,直至推出解。
                            逆推,从已知结果出发,直至推出解。

需要注意的:每一递推结果,都是下一步递推的条件。

顺推:
斐波那契数列  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月为止。那么这就是一个典型的逆推问题。由结果出发,推出解。
程序运行过程分析略。

递推思想只是简单的算法入门,讲述的也都是一些很基本的东西,不过里面的思维值得慢慢体会和揣摩。在日常的生活中,我们都经常会不自觉的使用到递推的思想。把握知其中的本质:从一个结果,根据特定的条件,推出下一个结果。那么有些复杂的事,就会变得很简单。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。