以斐波那契数列为例分析递归算法的时间复杂度和空间复杂度

原文:https://blog.csdn.net/superwangxinrui/article/details/79626870

首先来波概念:

   递归算法的时间复杂度:递归的总次数*每次递归的数量。
   递归算法的空间复杂度:递归的深度*每次递归创建变量的个数。
  那什么是斐波那契额数列呢?对于菲波那切数列有典型的生兔子的的问题,在这我就不多说了,感兴趣的同学可以自行查找资料来了解,简单的说,菲波那切数列数列就是前两项是1,后面的每项是其前两项之和。比如:1 1 2 3 5 8 13....
   下边我们来分别用不同的方法来求一下斐波那契。
(1)首先采用递归的方法来求一下:
[cpp]  view plain  copy
  1.   
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>int Fib(int n){if (n < 3){return 1;}else{return Fib(n - 1) + Fib(n - 2);}}int main(){int n = 50;int ret = Fib(n);printf("%d\n", ret);getchar();}

在递归调用过程中Fib(3)被计算了2次,Fib(2)被计算了3次。Fib(1)被调用了5次,Fib(0)中被调用了3次。所以,递归的效率低下,但优点是代码简单,容易理解。

 递归算法时间复杂度为(二叉树的节点个数):O()=(2^h)-1=2^n。空间复杂度为树的高度:h即o(n).

(2)可用尾递归方法来求,尾递归若优化,空间复杂度可达到o(1),但时间复杂度是o(n);

[cpp]  view plain  copy
  1. #define _CRT_SECURE_NO_WARNINGS   
  2. #include<stdio.h>  
  3. long Fib(long first, long second, long n){  
  4.     if (n < 3)  
  5.         return 1;  
  6.     if (3 == n)  
  7.     {  
  8.         return first + second;  
  9.     }  
  10.     return Fib(second, first + second, n - 1);  
  11.   
  12. }  
  13. int main()  
  14. {  
  15.     int n = 5;  
  16.     int ret = Fib(1,1,5);  
  17.     printf("%d\n", ret);  
  18.     getchar();  
  19. }  


(3) 采用循环结构实现。

[cpp]  view plain  copy
  1. #define _CRT_SECURE_NO_WARNINGS   
  2. #include<stdio.h>  
  3. long Fib(long first, long second, long n){  
  4.     int third = 0;  
  5.     if (n < 3)  
  6.         return 1;  
  7.     while (n >3){  
  8.         int temp = second;  
  9.     second = first + second;  
  10.     first = temp;  
  11.       
  12.     n--;  
  13. }  
  14.     third = first + second;  
  15.     return third;  
  16.       
  17. }  
  18. int main()  
  19. {  
  20.     int n = 6;  
  21.     int ret = Fib(1,1,n);  
  22.     printf("%d\n", ret);  
  23.     getchar();  
  24. }  

此时时间复杂度达到了o(n),空间复杂度达到了o(1).
所以综上所述,求菲波那切数列最好使用循环的方式。
最后来科普一下,常用时间复杂度所耗费的时间从小到大依次是o(1)<o(log2n)<o(n)<o(nlog2n)<o(n^2)<o(n^3)<o(2^n)<o(n!)<o(n^n).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值