递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法,递推算法分为顺推和逆推两种。
**
顺推法
**
所谓顺推法是从已知条件出发,逐步推算出要解决的问题的方法叫顺推。
如斐波拉契数列,设它的函数为f(n),已知f(1)=1,f(2)=1;f(n)=f(n-2)+f(n-1)(n>=3,n∈N)。则我们通过顺推可以知道,f(3)=f(1)+f(2)=2,f(4)=f(2)+f(3)=3……直至我们要求的解。
java代码实现如下(斐波拉契数列):
public int fibonacci(int n){
int[] f = new int[n];
f[0]=1;
f[1]=1;
for(int i=2;i<n;i++){
f[i]=f[i-1]+f[i-2];
}
return f[n-1];
}
**
逆推法
**
所谓逆推法从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为逆推。
若在第48月小龙大学毕业时连本带息要取1000元,则要先求出第47个月时银行存款的钱数
第47月月末存款=1000/(1+0.0171/12);
第46月月末存款=(第47月月末存款+1000)/(1+0.0171/12)
依次类推,可以求出第45月、第44月……的月末存款的数值
第45月月末存款=(第46月月末存款+1000)/(1+0.0171/12)
第44月月末存款=(第45月月末存款+1000)/(1+0.0171/12)
…… ……
第2月月末存款=(第3月月末存款+1000)/(1+0.0171/12)
第1月月末存款=(第2月月末存款+1000)/(1+0.0171/12)
java代码实现如下:
public float inverse(int n){
float[] r = new float[n];
r[n-1]=1000;
for(int i=n-2;i>=0;i--){
r[i]=(float) ((r[i+1]+1000.0)/(1+0.0172/12));
}
return r[0];
}
所以,递归就是在过程或函数里调用自身;在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。递归的关键在于找出递归方程式和递归终止条件。