头条面试题:爬楼梯——递归算法如何优化,注意不能用递推
情况:只写出了递归和递推,因为递推就是对递归的优化啊。。。
补充:后来写出来了,但是感觉本质上来讲还是递推啊。。。。想不通
package palouti;
public class Main {
//递归算法
static int digui(int n){
if (n == 1){
return 1;
}else if (n == 2){
return 2;
}else{
return digui(n-1)+digui(n-2);
}
}
//递归算法的优化(等同于半递归半递推)
static int[] ans = new int[100];
static int diguiyouhua1(int n){
ans[1] = 1;
ans[2] = 2;
if (n <= 2){
return ans[n];
}
if (ans[n-2] == 0){
ans[n-2] = diguiyouhua1(n-2);
}
return diguiyouhua1(n-1)+ans[n-2];
}
//递归算法的优化:相当于递推
static int[] ans = new int[100];
static int diguiyouhua(int n){
ans[1] = 1;
ans[2] = 2;
if (n <= 2){
return ans[n];
}
if (ans[n-2] == 0){
ans[n-2] = diguiyouhua(n-2);
}
if (ans[n-1] == 0){
ans[n-1] = diguiyouhua(n-1);
}
return ans[n-1]+ans[n-2];
}
//递推算法
static int ditui(int n){
int ans[] = new int[n+1];
ans[1] = 1;
ans[2] = 2;
for (int i = 3; i <= n; i++){
ans[i] = ans[i-1]+ans[i-2];
}
return ans[n];
}
public static void main(String[] args) {
long stime = System.currentTimeMillis();
System.out.println(Main.digui(40));
long etime = System.currentTimeMillis();
System.out.printf("递归执行时长:%d 毫秒.\n", (etime - stime));
stime = System.currentTimeMillis();
System.out.println(Main.diguiyouhua(40));
etime = System.currentTimeMillis();
System.out.printf("递归优化执行时长:%d 毫秒.\n", (etime - stime));
stime = System.currentTimeMillis();
System.out.println(Main.ditui(40));
etime = System.currentTimeMillis();
System.out.printf("递推执行时长:%d 毫秒.\n", (etime - stime));
}
}