题目:
java实现
class Fibonacci{
//递归
public static int fibonacci_recursion(int n){
if(n==0||n==1){
return 1;
}
if(n>=2){
return fibonacci_recursion(n-1)+fibonacci_recursion(n-2);
}
return -1;
}
//非递归
public static int fibonacci_non_recursion(int n){
int fib=0,fib_front=1,fib_behind=1;
if(n==0||n==1){
return 1;
}
for(int i=2;i<=n;i++){
fib=fib_behind+fib_front;
fib_front=fib_behind;
fib_behind=fib;
}
return fib;
}
public static void main(String[] args) {
System.out.println(fibonacci_recursion(10));
System.out.println(fibonacci_non_recursion(10));
}
}
时间复杂度分析
递归
函数的调用次数可以用二叉树来表示,以n=5为例,
函数的调用次数就等于二叉树的节点个数,而该二叉树的深度m(树中节点的最大层次称为深度,根节点为第一层)为n,如上例深度为5(看最左边那条路径),二叉树的最大节点个数为2m-1=2n-1。当函数的调用次数接近最大调用次数为2n-1时,可将函数调用次数近似当成2n-1,所以T(n)=O(函数调用次数)=O(2n-1)=O(2n)。
非递归
由上面的非递归代码可知,最好情况下时间复杂度为1,最坏情况下T(n)=O(n),因此时间复杂度T(n)=O(n)。