热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

C语言求Fibonacci斐波那契数列通项问题的解法总结

斐波那契数列相关问题是考研和ACM中常见的算法题目,这里特地为大家整理了C语言求Fibonacci斐波那契数列通项问题的解法总结,需要的朋友可以参考下

一:递归实现
   使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1。

二:数组实现
   空间复杂度和时间复杂度都是0(n),效率一般,比递归来得快。

三:vector实现
   时间复杂度是0(n),时间复杂度是0(1),就是不知道vector的效率高不高,当然vector有自己的属性会占用资源。

四:queue实现
   当然队列比数组更适合实现斐波那契数列,时间复杂度和空间复杂度和vector一样,但队列太适合这里了,
   f(n)=f(n-1)+f(n-2),f(n)只和f(n-1)和f(n-2)有关,f(n)入队列后,f(n-2)就可以出队列了。

五:迭代实现
   迭代实现是最高效的,时间复杂度是0(n),空间复杂度是0(1)。

六:公式实现
百度的时候,发现原来斐波那契数列有公式的,所以可以使用公式来计算的。

由于double类型的精度还不够,所以程序算出来的结果会有误差,如果把公式展开计算,得出的结果就是正确的。

完整的实现代码如下:

#include "iostream" 
#include "queue" 
#include "cmath" 
using namespace std; 
 
int fib1(int index)   //递归实现 
{ 
  if(index<1) 
  { 
    return -1; 
  } 
  if(index==1 || index==2) 
    return 1; 
  return fib1(index-1)+fib1(index-2); 
} 
int fib2(int index)   //数组实现 
{ 
  if(index<1) 
  { 
    return -1; 
  } 
  if(index<3) 
  { 
    return 1; 
  } 
  int *a=new int[index]; 
  a[0]=a[1]=1; 
  for(int i=2;i实现 
{ 
  if(index<1) 
  { 
    return -1; 
  } 
 
  vector a(2,1);   //创建一个含有2个元素都为1的向量 
  a.reserve(3); 
  for(int i=2;iq; 
  q.push(1); 
  q.push(1); 
  for(int i=2;i

七:二分矩阵方法

201663185151250.gif (312×428)

如上图,Fibonacci 数列中任何一项可以用矩阵幂算出,而n次幂是可以在logn的时间内算出的。
下面贴出代码:

void multiply(int c[2][2],int a[2][2],int b[2][2],int mod) 
{ 
  int tmp[4]; 
  tmp[0]=a[0][0]*b[0][0]+a[0][1]*b[1][0]; 
  tmp[1]=a[0][0]*b[0][1]+a[0][1]*b[1][1]; 
  tmp[2]=a[1][0]*b[0][0]+a[1][1]*b[1][0]; 
  tmp[3]=a[1][0]*b[0][1]+a[1][1]*b[1][1]; 
  c[0][0]=tmp[0]%mod; 
  c[0][1]=tmp[1]%mod; 
  c[1][0]=tmp[2]%mod; 
  c[1][1]=tmp[3]%mod; 
}//计算矩阵乘法,c=a*b 
 
int fibonacci(int n,int mod)//mod表示数字太大时需要模的数 
{ 
  if(n==0)return 0; 
  else if(n<=2)return 1;//这里表示第0项为0,第1,2项为1 
 
  int a[2][2]={{1,1},{1,0}}; 
  int result[2][2]={{1,0},{0,1}};//初始化为单位矩阵 
  int s; 
  n-=2; 
  while(n>0) 
  { 
    if(n%2 == 1) 
      multiply(result,result,a,mod); 
    multiply(a,a,a,mod); 
    n /= 2; 
  }//二分法求矩阵幂 
  s=(result[0][0]+result[0][1])%mod;//结果 
  return s; 
} 

附带的再贴上二分法计算a的n次方函数。

int pow(int a,int n) 
{ 
  int ans=1; 
  while(n) 
  { 
    if(n&1) 
      ans*=a; 
    a*=a; 
    n>>=1; 
  } 
  return ans; 
} 


推荐阅读
  • 如何在PHPcms网站中添加广告
    本文详细介绍了在PHPcms网站后台添加广告的方法,涵盖多种常见的广告形式,如百度广告和Google广告,并提供了相关设置的步骤。同时,文章还探讨了优化网站流量的SEO策略。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 当iOS设备越狱后,某些插件可能会导致系统崩溃(白苹果)。此时,可以通过进入安全模式来排查并删除有问题的插件。本文将详细介绍如何通过特定按键组合进入不加载MobileSubstrate的安全模式,并提供相关背景知识。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
author-avatar
尹嫱AileenDawnYin
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有