1、普通递归方法
private static int febonache(int n) {
if(n == 1){
return 1;
}else if(n == 2 ){
return 2;
}else {
return febonache(n-1) + febonache(n-2);
}
}
这个递归的时间复杂度是O(2^n),因为里面包含了大量重复的计算
2、不用递归方法
private static int noDiguiFebonache(int n){
if(n<=2){
return 1;
}
int a = 1;
int b = 1;
int c = 2;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
借助一个数组
private static int arrFebonache(int n){
if(n<=2){
return 1;
}
int[] data = new int[n];
data[0] = 1;
data[1] = 1;
for (int i = 2; i < n; i++) {
data[i] = data[i-1] + data[i-2];
}
return data[n-1];
}
3、改造递归的方法,因为在递归的过程中产生了大量重复的计算,如果把每一个计算结果存储起来,下次计算的时候可以直接来取,就省了一次运算,这样就可以节省空间和时间
private static int[] data = new int[100]; //借助一个数组作为缓存
private static int betterDiguiFebonache(int n){
if(n <= 2){
return 1;
}
if(data[n] > 0){
return data[n]; //先从缓存中获取数据,如果有,就不需要再通过递归获取了
}
int re = betterDiguiFebonache(n-1) + betterDiguiFebonache(n-2);
data[n] = re; //把已经查到的数据放入缓存中
return re;
}