当前位置:首页 > 实用技巧 >

斐波那契数列怎样快速求和(十个斐波那契数列如何快速求和)

来源:原点资讯(m.360kss.com)时间:2023-11-27 04:11:32作者:YD166手机阅读>>

斐波那契数列介绍

斐波那契数列(Fibonacci sequence)指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、55、89、144、……

在数学上,斐波那契数列的方法定义:

f(0) = 0 f(1) = 1 f(n) = f(n - 1) f(n - 2)(n ≥ 2)

这个数列从第3项开始,每一项都等于前两项之和。

方法1:递归

递归实现:

int fRecursion(int n){ if (n == 0) return 0; if (n == 1) return 1; return fRecursion(n - 1) fRecursion(n - 2); }

时间复杂度: O(2ⁿ)

我们用下面的递归调用树来理解递归实现的时间复杂度:

斐波那契数列怎样快速求和,十个斐波那契数列如何快速求和(1)

图1

因为每个节点在递归调用之外的工作时间为O(1), 所以运行时间等于调用的次数,即树中节点的总数。

这棵树有多少节点呢?假设我们要计算f(n), 根据图1我们可以知道树的深度为(n - 1)。

如果这是一棵完全二叉树,则树的总节点数为(2ⁿ-1),因此时间复杂度为O(2ⁿ)。

通过观察图1,我们可以看到右子树节点数总是比左子树节点数少,因此这棵树的总节点数比同样深度的完全二叉树少(真实运行时间接近O(1.6ⁿ))。因为O(2ⁿ)描述的是运行时间的上界,我们可以简单地说递归实现的时间复杂度为 O(2ⁿ)。

方法2:自上而下的动态规划

通过观察图1,我们可以看到很多重复的节点。其中f(3)出现了2次,f(2)出现了3次。为什么要重复地计算f(3), f(2)......? 如果我们把计算过的f(i)的值缓存起来,下次遇到计算过的值直接从缓存里取。递归过程如下图(灰色圆圈的值从缓存取):

斐波那契数列怎样快速求和,十个斐波那契数列如何快速求和(2)

图2

根据图2,我们可以看到f(n)的调用次数不超过O(n)。

自上而下的动态规划实现:

int fDynamicUpDown(int n){ return fDynamicUpDown(n, new int[n 1]); } int fDynamicUpDown(int i, int[] num) { if (i == 0) return 0; if (i == 1) return 1; if(num[i] == 0){ num[i] = fDynamicUpDown(i - 1, num) fDynamicUpDown(i - 2, num); } return num[i]; }

时间复杂度: O(n)

方法3:自下而上的动态规划

从已知条件中已经知道f(1)和f(0)的值,通过利用f(1)和f(0)的值,我们可以计算出f(2)的值。接着我们可以根据已知的值计算出f(3)、f(4)......

自下而上的动态规划实现:

int fDynamicDownUp(int n){ if (n == 0) return 0; if (n == 1) return 1; int[] num = new int[n]; num[0] = 0; num[1] = 1; for (int i = 2; i < n; i ) { num[i] = num[i-1] num[i-2]; } return num[n-1] num[n-2]; }

时间复杂度: O(n)

空间复杂度: O(n)

方法4:空间优化方法3

观察方法3,你会发现num[i]只会被使用2次:

num[i 1] = num[i] num[i-1]

num[i 2] = num[i 1] num[i]

我们可以用变量来存储中间值,不需要使用额外的num数组来存储中间值。

空间优化方法实现:

int fDynamicSpaceOpt(int n){ if (n == 0) return 0; if (n == 1) return 1; int a = 0, b= 1; for (int i = 2; i < n; i ) { int c = a b; a = b; b = c; } return a b; }

时间复杂度: O(n)

空间复杂度: O(1)

栏目热文

斐波那契数列奇数项求和公式推导(斐波那契数列求和方法)

斐波那契数列奇数项求和公式推导(斐波那契数列求和方法)

时间周期理论是股价涨跌的重要原因之一,它能够解释大多数市场涨跌的奥秘。在时间周期循环理论中,除了利用固定的时间周期数字寻...

2023-11-27 03:57:11查看全文 >>

迷你世界都有什么隐藏秘密(迷你世界隐藏的秘密有多少)

迷你世界都有什么隐藏秘密(迷你世界隐藏的秘密有多少)

如今迷你世界这款游戏已经与小伙伴见面四年多了,前段时间迷你世界进行了大更新,相信很多朋友都已经在游戏中进行了爽快的畅玩,...

2023-11-27 03:57:39查看全文 >>

迷你世界中地牢在哪里(迷你世界地牢在哪好找)

迷你世界中地牢在哪里(迷你世界地牢在哪好找)

迷你世界游戏作为国内十分出名的沙盒游戏也吸引来了无数的玩家,很多人都喜欢在游戏中进行探索,但是因为沙盒游戏本身具有很多的...

2023-11-27 04:21:27查看全文 >>

迷你世界一个地方有几个地牢(迷你世界地牢旁边一般都有什么)

迷你世界一个地方有几个地牢(迷你世界地牢旁边一般都有什么)

大家好,我是你们的好朋友小雯。在迷你世界这款游戏中,无论哪一位玩家都会经历从萌新到大神的阶段,每一位大神都是从萌新开始玩...

2023-11-27 04:13:28查看全文 >>

迷你世界地牢里有什么(迷你世界哪个山洞有地牢)

迷你世界地牢里有什么(迷你世界哪个山洞有地牢)

迷你世界自从问世以来,就深受广大玩家喜爱,不仅爱游戏的画质,而且更爱游戏的自由创作。都市、房屋可以按照自己的风格来设计,...

2023-11-27 04:01:59查看全文 >>

斐波那契数列偶数项求和公式推导(斐波那契数列求和有哪两种方法)

斐波那契数列偶数项求和公式推导(斐波那契数列求和有哪两种方法)

斐波那契数列之美斐波那契是一位数学家,生于公元1170年,籍贯大概是比萨,卒于1240年后。1202年,他撰写了《珠算原...

2023-11-27 04:32:27查看全文 >>

斐波那契数列用数字求和(斐波那契数列求和问题及解决方法)

斐波那契数列用数字求和(斐波那契数列求和问题及解决方法)

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda...

2023-11-27 04:11:57查看全文 >>

斐波那契数列前40项求和(斐波那契数列前10项平方和公式)

斐波那契数列前40项求和(斐波那契数列前10项平方和公式)

分享一个隐藏着宇宙中的某个终极奥秘的神秘数列——斐波那契数列!指的是这样一个数列:1、1、2、3、5、8、13、21、3...

2023-11-27 03:57:41查看全文 >>

计算斐波那契数列前20项(斐波那契数列第20项的数值)

计算斐波那契数列前20项(斐波那契数列第20项的数值)

非 Java 原生程序员的语言流畅性学习一种新的编程语言比学习新的口头语言要容易得多。然而,在这两种学习过程中,都要付出...

2023-11-27 04:02:53查看全文 >>

计算斐波那契数列求和(斐波那契数列求和公式推导)

计算斐波那契数列求和(斐波那契数列求和公式推导)

斐波那契(Leonardo Pisano Fibonacci ;1170 — 1250 )意大利数学家,是西方第一个研究...

2023-11-27 03:57:33查看全文 >>

文档排行