Fibonacci 数列及其计算方法
来源:互联网 发布:上海二手住宅成交数据 编辑:程序博客网 时间:2024/06/05 22:37
Fibonacci 数列及其计算方法
斐波那契数列(Fibonacci sequence),又称黄金分割数列,这个数列最早是由印度数学家提出来的。不过更多的人学习到这个数列是因为意大利数学家列昂纳多·斐波那契(Leonardoda Fibonacci)和他的《Liber Abaci》一书。在这本书中,列昂纳多·斐波那契以兔子繁殖为例子引出了这个序列,因此这个序列又称为“兔子数列”。
这个序列的前几项是这样的:
在数学上,斐波纳契数列以如下被以递归的方法定义:
Fibonacci 数列的通项公式
Fibonacci 数列除了递归形式之外,当然还可以写出通项公式。下面就来算算
是典型的线性差分方程,可以用经典的待定系数法来解,当然也可以用
化简一下,得到:
很显然,
那么
这是一个简单的二元一次方程,计算后可以得到:
所以:
当
所以
有些没有学过差分方程理论的同学可能会问为什么假设
我们再构造两个辅助的差分方程:
那么当起始条件相同时,明显有
所以
所以我们猜测
程序实现
斐波纳契数列的定义是递归形式的。自然,用递归函数最容易实现。
uint64_t Fibonacci(unsigned char n){ if( n == 0 ) return 0; if( n == 1 ) return 1; return Fibonacci(n - 1) + Fibonacci(n - 2);}
这个代码虽然简单,但是计算复杂度却太高。当
我们可以简单的算一下,当计算
我们用
那么这个
我们又知道
如果将递归算法改为递推,时间复杂度会降低很多。
uint64_t Fibonacci(unsigned char n){ if( n == 0 ) return 0; if( n == 1 ) return 1; uint64_t fn, fnn = 1, fnnn = 0; for(int i = 2; i <= n; i ++) { fn = fnn + fnnn; fnn = fn; fnnn = fnn; } return fn;}
这个程序很简答,for 循环中计算了
那么原来的递归算法就没有改进的余地了吗?递归算法之所以算的慢,是因为计算
可以看到
uint64_t Fibonacci(unsigned char n){ static uint64_t fib[256] = {0, 1}; if(n == 0) return 0; if( fib[n] != 0 ) return fib[n]; fib[n] = Fibonacci(n - 1) + Fibonacci(n - 2); return fib[n];}
这个代码还用到了 static 型局部数据变量的一个特性:没有指定值的元素自动初始化为 0。如果没有这个特性,我们的程序中就要写上 255 个 0 了。
除了上面给出的两种
我们将递推表达式变变型就能得到:
因此,计算
当
当
也就是说当
这里还有一个问题一直没有解决,就是我们的程序可以正确计算到
简单的计算可知:
所以:
所以 32 位无符号整数最大可以表示到
- Fibonacci 数列及其计算方法
- 三种Fibonacci数列第n项计算方法及其优劣分析
- Fibonacci数列第N项的两种计算方法比较
- Fibonacci计算方法
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- (OK)(OK)(All in CLI) running two Android-x86 which connect to NS3(MANETs) via "ethernet bridge"
- Excel -- 3. 数据管理和分析
- Leetcode算法题分类解析:(一)总览
- new、new()和new[]三者的区别
- 操作系统之loader的实现
- Fibonacci 数列及其计算方法
- Linkit Smart 7688 //OpenWrt - 2port
- C语言函数拾遗
- POI之图片导出到PPT简单实例
- ubuntu下安装spark
- C面试宝典-(程序题)1
- Fragment的陷阱
- Android MediaPlayer工具类
- leetcode——Combination Sum