一、CODE
1、常规解法
public static int fib(int n){
if(n==1 || n==2){
return 1;
}
System.out.println("iiii");
return fib(n-1)+fib(n-2);
}
2、自顶向下:备忘录模式
int[] arr=new int[11];
public static int fib1(int[] arr,int n){
if(n==1 || n==2){
arr[n]=1;
return 1;
}
if (arr[n]!=0){
return arr[n];
}
System.out.println("iiii");
arr[n]=fib1(arr,n-1)+fib1(arr,n-2);
return arr[n];
}
3、自底向上
public static int fib2(int n){
int[] arr=new int[n+1];
arr[1]=1;
arr[2]=1;
for (int i = 3; i < n+1; i++) {
arr[i]=arr[i-1]+arr[i-2];
}
System.out.println(Arrays.toString(arr));
return arr[n];
}
二、思考🤔
1、三种解法的对比
(1)常规解法时间复杂度太。。。。嗯,就是需要很多步骤,因为比如求fib(10),那么fib(8)就会求好多次,最容易想,程序运行最慢。
(2)自顶向下的解法,就是把常规解法进行了改良,加了一个备忘录,也就是数据不重复计算了。
(3)自底向上的解法:这个不是改良出来的,这像变种,感觉这种解法最顺眼,没有前面两种好想。