递归实现:
public static int fibonacci(int n){
if(n <= 2){
return 1;
}else{
return fibonacci(n-1) + fibonacci(n-2);
}
}
时间复杂度:O(2^(N/2))<=T(N)<=O(2^N)
特点:
效率很低,例如我们要求fibonacci(10),那么我们需要先求fibonacci(8)和fibonacci(9),同样,要求fibonacci(9),就要求fibonacci(8)和fibonacci(7),这样我们就重复求了fibonacci(8)。随着n的增大重复的节点急剧增大。
非递归实现:
public static int fibonacci(int n){
if(n <= 2)
return 1;
int fibNMinusOne = 1;
int fibNMinusTwo = 0;
int fibN = 0;
for(int i = 2;i <= n;i++){
fibN = fibNMinusOne + fibNMinusTwo;
fibNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;
}
return fibN;
}
时间复杂度:O(N)
相关算法题:
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。