递归的优化主要是三个手段
1.转化为循环实现
2.缓存中间结果
3.尾递归
我们通过斐波拉契数列的例子来展示优化的效果
首先先用普通递归来算45的斐波拉契数,用了3秒多
接着我们使用循环来代替,用了0毫秒
接着我们通过缓存中间结果来优化,耗时1毫秒
最后我们使用尾递归优化,耗时0ms
附上代码:
/**
* 斐波那契数列
*/
public class Fiber {
public static int fun(int n){
// 递归结束条件
if(n<=1) return n;
//等价关系式 实现功能
return fun(n-1)+fun(n-2);
}
public static int fun1(int n){
if(n==1 || n==2){
return 1;
}
int f1 = 1;
int f2 = 1;
int f3 = f1+f2;
while(n>3){
f1=f2;
f2=f3;
f3 =f1+f2;
n--;
}
return f3;
}
public static int[] dataCache = new int[46];
public static int fun2(int n){
if(n<=1) {
return n;
}
if(dataCache[n]!=0){
return dataCache[n];
}
int res = fun2(n-1)+fun2(n-2);
dataCache[n]=res;
return res;
}
public static int fun3(int n,int pre,int res){
if(n<=1){
return res;
}
return fun3(n-1,res,pre+res);
}
public static void main(String[] args) {
Long start = System.currentTimeMillis();
System.out.println(fun3(45,0,1));
Long end = System.currentTimeMillis();
//1134903170
System.out.println("尾递归优化递归算斐波拉契数列耗时:"+(end - start)+"ms");
}
}