问题
来自王道考研数据结构书籍,思维拓展
斐波那契数列有两种常用的算法:递归算法和非递归算法。试分别分析两种算法的时间复杂度。
递归方式
递归方式代码:
递归结束条件可以不同,如果数列从第一个开始且为1,那么就是如下结束条件。
如果从第0个开始且第0个为0,那么结束条件就会改变:n等于0时返回0,n等于1时返回1
#include <stdio.h>
#include <stdlib.h>
int Fibonacci(int n){
if(n==1||n==2)
return 1;
else
return Fibonacci(n-1)+Fibonacci(n-2);
}
int main(int argc, char *argv[]) {
int n;
scanf("%d",&n);
int result = Fibonacci(n);
printf("%d",result);
return 0;
}
时间复杂度可通过下图分析:
如果是一个满二叉树的话,其时间复杂度就是O(2^n)。但实际上并不是满二叉树,所以比这个要小一点。网上有确切的值以及推导过程,大家可以看看。
非递归方式
代码如下:
#include<stdio.h>
#include<stdlib.h>
int Fibonacci(int n){
if(n<=2){
return 1;
}else{
int num1=1;
int num2=1;
int i;
for(i=2;i<n;i++){
num2=num1+num2;
num1=num2-num1;
}
return num2;
}
}
int main(){
int n;
scanf("%d",&n);
int result=Fibonacci(n);
printf("%d",result);
}
直接看for循环即可,语句重复执行的次数是n的数量级,所以时间复杂度为O(n)。