递归思想

来源:互联网 发布:兰灯翻墙for mac 编辑:程序博客网 时间:2024/05/19 16:49


一个方法体内调用他自身,被称为方法递归;方法递归包含了一种隐式的循环,他会重复执行某段代码,但这种重复执行无须循环控制;

       已知有一个数列: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(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;




0 0
原创粉丝点击