1. 效率很低的解法
public static long fibonacci1(int n) {
if (n <= 0) return 0;
if (n == 1) return 1;
return fibonacci1(n-1) + fibonacci1(n-2);
}
缺点:递归求解的过程中,有很多的节点是重复的,而且重复的节点数会随着n的增大而急剧增加,这就意味着计算量会随着n的增大而急剧增大。
2. 避免重复节点的方法
从下往上计算,首先根据f(0)和f(1)算出f(2),f(1)和f(2)算出f(3)···以此类推就可以算出第n项了,时间复杂度是O(n)。
public static long fibonacci2(int n) {
if (n == 1 || n == 2) return 1;
long fibNMinusOne = 1; // 用来记录计算项的前面的前面的数
long fibNMinusTwo = 1; // 用来记录当前计算项的前一项
long fibN = 0; //用来记录结果
for (int i = 2; i < n; i++) {
fibN = fibNMinusOne + fibNMinusTwo;
fibNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;
}
return fibN;
}
3.时间复杂度为O(logn)但不够实用的解法
public static int fibonacci3(int n) {
if (n == 0) return 1;
if (n == 1) return 1;
//n为偶数
if (n % 2 == 0) return fibonacci3(n / 2) * fibonacci3(n / 2) + fibonacci3(n / 2 - 1) * fibonacci3(n / 2 - 1);
//n为奇数
else return fibonacci3(n / 2) * fibonacci3(n / 2 + 1) + fibonacci3(n / 2 - 1) * fibonacci3(n / 2);
}