前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数学的算法代码如何实现:神奇的斐波那契数列(Fibonacci sequence)

数学的算法代码如何实现:神奇的斐波那契数列(Fibonacci sequence)

原创
作者头像
Lion Long
修改2024-11-16 15:09:21
120
修改2024-11-16 15:09:21
举报
文章被收录于专栏:后端开发技术

“好事”发生

这里推荐一篇实用的文章:《【Docker项目实战】使用Docker部署Notepad轻量级记事本》,作者:【江湖有缘】。

https://cloud.tencent.com/developer/article/2466037

是一篇 Docker 项目实战,演示部署一个轻量级记事本应用,实现了跨设备的临时文本存储与编辑功能,文章中的实践可以显著加深对 Docker 容器化技术的理解。这是一篇极具价值的经验文章,为更复杂的应用开发奠定坚实基础。

一、斐波那契数列的定义

斐波那契数列可以用兔子数列来理解。 首先假设第一个月有一对初生兔子,第二个月进入成熟期,第三个月开始生育兔子,并兔子永不死去,它们按照下列的方式繁衍:

  1. 第一个月,1号兔子没有繁殖能力,还是一对。
  2. 第二个月,1号兔子进入成熟期,没有繁殖,还是一双。
  3. 第三个月,1号兔子生一对兔子(2号),这个月有(1+1=)2对兔子。
  4. 第四个月,1号兔子生一对兔子(3号),2号兔子进入成熟期,这个月有(1+2=)3对兔子。
  5. 第五个月,1号兔子生一对兔子(4号),2号兔子生一对兔子(5号),3号兔子进入成熟期,这个月有(3+2=)5对兔子。
  6. 第六个月,1号兔子生一对兔子(6号),2号兔子生一对兔子(7号),3号兔子进生一对兔子(8号),4号、5号 兔子进入成熟期,这个月有(3+5=)8对兔子。 …

依此类推。 可以明显地看到:当月的兔子数=上个月兔子数+上上个月兔子数。

所以,不难看出,斐波那契数列是这样的:1,1,2,3,5,8,13,21,34,55,...

递归表达就是:

图片
图片

二、Fibonacci算法设计

2.1、递归算法

设计递归算法实现斐波那契数列。

代码语言:javascript
复制
int Fibonacci(int n)
{
	if (n <= 0)
		return 0;
	if (n == 1 || n == 2)
		return 1;

	return Fibonacci(n - 1) + Fibonacci(n - 2);
}

测试代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int Fibonacci(int n)
{
	if (n <= 0)
		return 0;
	if (n == 1 || n == 2)
		return 1;

	return Fibonacci(n - 1) + Fibonacci(n - 2);
}

int main(int argc,char **argv)
{
	int n = 6;
	if (argc > 1)
		n = atoi(argv[1]);

	printf("n= %d, Fibonacci: %d\n", n, Fibonacci(n));

	return 0;

}

执行结果:

代码语言:javascript
复制
$ ./Fibonacci
n= 6, Fibonacci: 8

$ ./Fibonacci 10
n= 10, Fibonacci: 55

2.2、算法时间复杂度

用T(n)表示示Fibonacci(n)所需的基本操作次数,则: n=1时,T(n)=1。 n=2时,T(n)=1。 n=3时,T(n)=3;调用Fib1(2)和Fib1(1)并执行一次加法运算(Fib1(2)+Fib1(1))。

因此,n>2时,T(n)=T(n-1)+T(n-2)+1。它们的关系为:

图片
图片

斐波那契数列的通项公式:

图片
图片

这里可以看到,时间复杂度属于爆炸增量函数。

2.3、算法改进1

代码语言:javascript
复制
int Fibonacci_1(int n) {
	int *F = new int[n + 1];//定义一个长度为n+1的数组,空间尚未使用
	F[1] = 1;
	F[2] = 1;
	for (int i = 3; i <= n; i++)
		F[i] = F[i - 1] + F[i - 2];
	return F[n];
}

这时,时间复杂度O(n),空间复杂度O(n)。时间复杂度降下来了,算法效率有了重大突破,但是空间复杂度上去了。

2.4、算法优化2

上述算法优化使用了一个辅助数组记录中间结果,空间复杂度O(n);其实只需要第n个斐波那契数,中间结果只是为了下一次使用,不需要保存。所以,可以采用迭代法进行算法优化:

代码语言:javascript
复制
int Fibonacci_2(int n){
    if(n==1||n==2)   
         return 1;
    int f1=1; 
    int fs2=1;
    for(int i=3;i<=n;i++){
         int tmp=f1+f2;
         f1=f2;
         f2=tmp;
    }
    return f2;
}

使用三个辅助变量进行迭代,时间复杂度O(n),但是空间复杂度降为O(1)。

三、斐波那契数列与黄金分割数

随着n趋向无穷大,斐波那契数列中前一项与后一项的比值越来越逼近黄金分割数0.618。

图片
图片

四、总结

  1. 斐波那契数列起源于兔子数列,数学源于生活。斐波那契数列与黄金分割数有着千丝万缕的关系。
  2. 算法难学的一个原因是算法本身具有一定的复杂性,需要持之以恒的学习和拓展自己的思维

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • “好事”发生
  • 一、斐波那契数列的定义
  • 二、Fibonacci算法设计
    • 2.1、递归算法
      • 2.2、算法时间复杂度
        • 2.3、算法改进1
          • 2.4、算法优化2
          • 三、斐波那契数列与黄金分割数
          • 四、总结
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档