最后附有全代码
建一个测试类
> public class Digui {
> //声明静态变量缓存方法优化使用
> private static int[] ache;
>
> public static void main(String[] args) {
> ache=new int[46];
> for (int i = 0; i < 46; i++) {
> long date=System.currentTimeMillis(); // System.out.println(i+"的结果是"+digui(i)+"的时间是"+(System.currentTimeMillis()-date));
> //
> System.out.println(i+"的结果是"+noDiGui(i)+"的时间是"+(System.currentTimeMillis()-date));
> //
> System.out.println(i+"的结果是"+diGuiAche(i)+"的时间是"+(System.currentTimeMillis()-date));
> //
> System.out.println(i+"的结果是"+weiDiGui(i,1,1)+"的时间是"+(System.currentTimeMillis()-date));
> }
> }
> }
最原始的方法
/**
* 递归 时间复杂度是2^n 空间负责度2^n n=45的时候运行时间为2.4s左右
* @param a
* @return
*/
static int digui(int a){
if(a<=2){
return 1;}
return digui(a-1)+digui(a-2);
}
使用非递归
// 使用非递归
static int noDiGui(int n){
if(n<=2){return 1;}
int m=1;
int p=1;
int res=0;
for (int i = 2; i < n; i++) {
res=p+m;
m=p;
p=res;
}
return res;
}
使用缓存
//使用缓存
static int diGuiAche(int n){
if(n<=2){
return 1;}
int res=0;
if(ache[n]>0){
return ache[n];
}
res=diGuiAche(n-1)+diGuiAche(n-2);
ache[n]=res;
return res;
}
尾递归 (有点好玩)
//尾递归
static int weiDiGui(int n,int last,int lastLast){
if(n<=2){
return lastLast;
}
return weiDiGui(n-1,lastLast,last+lastLast);
}
全代码
package com.testList;
import org.apache.commons.codec.language.bm.Lang;
import java.util.Date;
public class Digui {
//声明静态变量缓存方法优化使用
private static int[] ache;
public static void main(String[] args) {
ache=new int[46];
for (int i = 0; i < 46; i++) {
long date=System.currentTimeMillis();
// System.out.println(i+"的结果是"+digui(i)+"的时间是"+(System.currentTimeMillis()-date));
// System.out.println(i+"的结果是"+noDiGui(i)+"的时间是"+(System.currentTimeMillis()-date));
// System.out.println(i+"的结果是"+diGuiAche(i)+"的时间是"+(System.currentTimeMillis()-date));
// System.out.println(i+"的结果是"+weiDiGui(i,1,1)+"的时间是"+(System.currentTimeMillis()-date));
}
}
/**
* 递归 时间复杂度是2^n 空间负责度2^n n=45的时候运行时间为2.4s左右
* @param a
* @return
*/
static int digui(int a){
if(a<=2){
return 1;}
return digui(a-1)+digui(a-2);
}
// 使用非递归
static int noDiGui(int n){
if(n<=2){return 1;}
int m=1;
int p=1;
int res=0;
for (int i = 2; i < n; i++) {
res=p+m;
m=p;
p=res;
}
return res;
}
//使用缓存
static int diGuiAche(int n){
if(n<=2){
return 1;}
int res=0;
if(ache[n]>0){
return ache[n];
}
res=diGuiAche(n-1)+diGuiAche(n-2);
ache[n]=res;
return res;
}
//尾递归
static int weiDiGui(int n,int last,int lastLast){
if(n<=2){
return lastLast;
}
return weiDiGui(n-1,lastLast,last+lastLast);
}
}