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;}
