斐波那契数:斐波那契数列指的是1、1、2、3、5、8、13、21、······这样一个数列,我们可以发现它后面的一个数是前两个数之和。而在这个数列中的数就被称为斐波那契数。
时间复杂度:时间复杂度实际就是一个函数,该函数计算的是执行基本操作的次数。
时间复杂度的O渐进表示:算法语句总的执行次数是关于问题规模N的某个函数,记为f(N),N称为问题的规模。语句总的执行次数记为T(N),当N不断变化时,算法执行次数T(N)的增长速率和f(N)的增长速率相同。则有T(N) =O(f(N)),称O(f(N))为时间复杂度的O渐进表示法。
空间复杂度:类似于算法的时间复杂度,它是算法所需存储空间的度量,记作S(n)=O(f(n))。
接下来就讨论一下斐波那契数的相关问题
用C语言实现:求第N个斐波那契数
这里可以采用递归、循环、尾递归三种方法来解决
方法一:递归
#include<stdio.h>
#include<stdlib.h>
long long Fib(long long N)
{
  if (N < 3)    //当N<3时,斐波那契数为1
  return 1;
  return Fib(N - 1) + Fib(N - 2);//函数递归
}
int main()
{
  int n = 0;
   scanf("%d",&n);
   printf("%d",Fib(n));
   system("pause");
   return 0;
}
1.时间复杂度   O(2^n)
首先可以根据函数递归执行顺序画出下图的二叉树结构(假设求第五个斐波那契数)
2.空间复杂度   O(1)
①-③:调用Fib(5),首先需调用Fib(4),Fib(4)要先调用Fib(3),逐步调用直至返回Fib(2)的值1,Fib执行结束,所创建空间销毁。此时Fib(5)、Fib(4)、Fib(3)均未调用结束,程序共占用4个函数栈帧空间。
④-⑨:Fib(2)执行结束,接下来调用Fib(1),创建一个函数栈帧空间,调用结束返回1后,该空间销毁,此时可得到Fib(3)=2,通过第⑦步返回Fib(3)的值,第⑧步同样创建空间再次调用Fib(2),调用结束销毁空间,此时可得到Fib(4)=3,通过第⑨步返回Fib(4)的值,此过程最大占用4个函数栈帧空间。
⑩-···:最后和上面一样,调用Fib(3),将返回值传给Fib(5)的模块,最终得到Fib(5)=5。
整个程序执行过程中,最多占用4个函数栈帧空间的大小,设一个函数栈帧空间为C
因此可得知当n=5时,该程序空间复杂度为O(4C)=>O(1)
当求第n个斐波那契数时,程序空间复杂度为O(n-1)C (n是常数)=>O(1)
方法二:循环
1.当n为1和2时result为1;
2.使用while循环,循环条件为n>2,当n--至n为零循环结束
3.循环内部:将前一次的result赋给新的pre_result
将前一次的pre_result赋给新的next__oder_result
每次的result通过pre_result+next__oder_result进行计算
4.返回result。
#include<stdio.h>
#include<stdlib.h>
long Fib(long N)
{
  int result = 0;      //前两个数之和
  int pre_result = 1;   //前一个数
  int next_older_result = 1; //前前一个数-_-!
   result = pre_result;    
   while (N > 2)           
   {                   
    N--;
     next_older_result = pre_result;
     pre_result = result;      
     result = pre_result + next_older_result;//结果为前两个数之和
    }
    return result;
}
int main()
{
     int n = 0;
     scanf("%d",&n);
     printf("%d",Fib(n));
     system("pause");
    return;
}
1.时间复杂度    O(n)
程序中循环了n-2次,时间复杂度为O(n-2),保留最高阶时间复杂度为O(n)
2.空间复杂度    O(1)
该程序中创建了3个变量,即创建了3个内存空间,空间复杂度为O(3)即O(1)
方法三:尾递归
#include<stdio.h>
#include<stdlib.h>
long Fib(long first, long second, long N)
{
 if (N < 3)
  return 1;
 if (3 == N)
  return first + second;
 return Fib(second, first + second, N - 1);
}
int main()
{
 int n = 0;
 scanf("%d",&n);
 printf("%d",Fib(1,1,n));
 system("pause");
 return 0;
}
1.时间复杂度   O(n)
根据尾递归的图解可看出,计算Fib(1,1,5)时,函数调用了3次,那么计算Fib(1,1,n)时,函数将调用n-2次,
由此可得时间复杂度为O(n-2)即O(n)。
2.空间复杂度   O(n)
尾递归的方法,需开辟n-2个空间,空间复杂度为O(n-2)即O(n)。

斐波那契数的时间复杂度、空间复杂度详解相关推荐

  1. 斐波那契查找(黄金分割法)超详细详解

    斐波那契查找思路 说句实在话,这个斐波那契查找我看了不下5遍才理解他的思路和代码,因为它里面的值太多,不好理解容易绕晕,所以我给大家用自己的理解讲一下 什么是斐波那契 要想学会斐波那契查找,首先你得知 ...

  2. LeetCode 873. 最长的斐波那契子序列的长度 题目详解

    题目详情 如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的: n >= 3 对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_ ...

  3. python 斐波那契数列 yield_Python之yield详解

    今天小编给大家带来的是Python教程之yield,好多新人跟小编反应这个东西不懂,而且网上也没找到足够简单的教程,小编回复了大家之后觉得很有必要将yield讲一下. 在讲yield之前必须明确两个概 ...

  4. 斐波那契数与二分法的递归与非递归算法及其复杂度分析

    1. 什么是斐波那契数? 这里我借用百度百科上的解释:斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏 ...

  5. 斐波那契数的两种实现方式———1.递归实现,2迭代实现

    对于斐波那契数,若是采用递归的算法,每个递归调用都将触发另外两个递归调用,而这两个中调用任意一个还会触发另外两个的调用.递归调用的时间复杂度O(2^N),空间复杂度为O(N),所以在计算略大的数会花费 ...

  6. 【数据结构】递归斐波那契数列的时间复杂度、空间复杂度

    递归斐波那契数列的时间复杂度相对于循环等函数而言并不容易看出来,下面通过斐波那契数列的程序进行图解: long long Fib(size_t N) {if (N < 3)return 1;re ...

  7. 动态规划学习之三种方法解决斐波拉契数

    斐波拉契数是一个很经典的问题,也会很多公司面试的考题,每个学习计算机的同学都会接触这个问题,尤其是在学习递归的时候,利用递归来解决斐波拉契数是很多教材采用的一个例子,所以很多同学一想到斐波拉契马上就会 ...

  8. LeetCode-动态规划基础题-509. 斐波那契数

    描述 题目如下: 509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0 ...

  9. D38| DP理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

    DP理论基础 重要知识点: 1.动规和贪心的区别:动规是由前一个状态推导出来的,而贪心是局部直接选最优的 2.动规五部曲: 1)确定dp数组(dp table)以及下标的含义 2)确定递推公式 3)d ...

最新文章

  1. Tensorflow入门——训练结果的保存与加载
  2. 二十五、求单点的最短路径
  3. 成本直降50%,下一代网关震撼发布
  4. linux 7 没有权限访问,技术|RHCSA 系列(十三): 在 RHEL 7 中使用 SELinux 进行强制访问控制...
  5. Tomcat发布网页的方法记录
  6. python怎么用for循环找出最大值_在for循环Python中查找前10个最大值
  7. java面向对象练习题一
  8. oracle的sql优化
  9. 为什么会出现NoSQL数据库
  10. 基于Socket网络编程基本步骤
  11. USB转串口,JLINK驱动安装(亲测有效)
  12. CET UTC GMT CST 各种时区区别
  13. 计算机图形学---常用颜色模型汇总(RGB,CMY,HSV)
  14. Sort Sort Sort
  15. 【解决方案 二十三】带单位的数值转大写人民币金额
  16. CELLID GET
  17. Oracle-enq:TX-row-contention等待场景
  18. 高维数组相乘的运算规则
  19. c语言每日签到_签到C语言实现
  20. MySQL各种优化基于《高性能MySQL第三版》

热门文章

  1. 2022年度总结 - 明月醉窗台
  2. 2021电工杯B题建模思路代码完整版
  3. 聚焦·洞察 家有矿(HOME MINE)共识生态全球行圆满召开
  4. 母猪公司和沙丁鱼罐头
  5. java 7 安装_Java7详细安装使用技巧教程
  6. 2021威海高考成绩查询电话,2021威海高考成绩查询系统
  7. 推荐系统之DIN模型(注意力机制对业务的理解)
  8. caffe不支持relu6_caffe cudaSuccess (4 vs. 0) unspecified launch failure
  9. 匈牙利离散(板子向)
  10. 表格操作系列——在指字的区域内增加或删除行不影响排版