一个方法体内调用他自身,被称为方法递归;方法递归包含了一种隐式的循环,他会重复执行某段代码,但这种重复执行无须循环控制;
已知有一个数列:f(0)=1,f(1)=4,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值;
package object;
/**
* Description:<br>
* 功能:递归思想;
* @author CJF
*
*/
public class Recursive {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
// 输出fn(10)的值
System.out.println(new Recursive().fn(10));
}
// f(0)=1;f(1)=4;fn(n+2)=2*f(n+1)+f(n);
public int fn(int n) {
if (n == 0) {
return 1;
} else if (n == 1) {
return 4;
} else {
return 2 * fn(n - 1) + fn(n - 2); // 关键点为这个式子的是如何转换而来
}
}
}
对于fn(10),等于2*fn(9)+fn(8),其中fn(9)又等于2*fn(8)+fn(7).......依次类推,最终会计算到fn(2)=2*fn(1)+fn(0),即fn(2)是可计算的,然后一路反酸回去,就可以最终得到fn(10)的值;
如果将上面数学题改成, 已知有一个数列:f(20)=1,f(21)=4,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值;
则将fn函数改成
// f(20)=1;f(21)=4;fn(n+2)=2*f(n+1)+f(n);
public int fn1(int n) {
if (n == 0) {
return 1;
} else if (n == 1) {
return 4;
} else {
return fn(n + 2) - 2 * fn(n + 1);
}
}
数列递归:
* 如果只知道小的数fn(0),fn(1),
* 则将式子 fn(n+2)=2*fn(n+1)+fn(n) 转换成 fn(n)=2*fn(n-1)+2*fn(n-2)<br>
* 则将式子 fn(n+2)=2*fn(n+1)+fn(n) 转换成 fn(n)=2*fn(n-1)+2*fn(n-2)<br>
*
* 如果只知道大的数fn(20),fn(21),* 则将式子 fn(n+2)=2*fn(n+1)+fn(n) 转换成 fn(n)=fn(n+2)-2*fn(n+1)<br>
*
* 就是当知道大的数,把式子fn(n)移到式子左边,其他两项在右边;
* 当知道小的数,把式子fn(n+2)当成fn(n),其他两项依次将变量数减少2;