斐波那契数列
来源:互联网 发布:网络用语古是什么意思 编辑:程序博客网 时间:2024/05/29 10:53
大家在高中学习数学的时候,也许都接触过 斐波那契 数列:
1,1,2,3,5,8......
也就是说,除了第一个和第二个元素外,后面的元素的值均为其前两个元素值的和。但在我印象中,老师从来没有介绍过这个数列的通项公式(即一个数学表达式能清晰的表达出它的规律)。到了大学的时候,作为电子或者计算机相关学科的同学们,会学习C语言的相关知识,那个时候,典型的编程题,也会拿 斐波那契 数列举例。
首先,我们可以根据斐波那契数列的规律,得出它的推导公式:
然后,我们根据推导公式,很容易用C语言实现其算法
int result(int index) { if (index == 1 || index == 2) { return 1; } return result(index - 1) + result(index - 2);}
紧接着的工作就是调用即可:
int main(int argc, const char * argv[]) { clock_t start = clock(); printf("%d\n", result(45)); clock_t end = clock(); double duration = (double)(end - start); printf( "%f seconds\n", duration / CLOCKS_PER_SEC); return 0;}
我们可以尝试传入不同的数值,便可以得到相应的结果。但是如上例中,当我尝试得到 斐波那契 数列的第45个位置的值时,耗时很久; 那是因为以上算法,采用的是递归算法;效率低下。 打印结果如下:
从上面的推导公式,可以看出来,我们并没有得到Fn关于n的函数,即通项公式。 上面只是利用计算机强行进行计算;但我们可以从数学的角度进一步分析 斐波那契 数列,即尝试得到它的通项公式!!!
一、 我们假设数列的生成函数如下:
其中 F1, F2, F3, F4... 就是斐波那契数列的值, 这里为1,1,2,3...
二、 将上面式子分别乘以 x 和 x的平方,结果如下:‘
三、 将上面式子,第一个 + 第二个 - 第三个
得到左边的结果:’
得到右边的结果:
而根据文章一开头的推导公式,我们知道 从 x的三次方之后, 其系数结果均为0, 所有右边的最终结果就是 -F1*x, 而F1的值是1, 所有右边的结果就是 -x.
综上所述,我们可以得到 斐波那契 数列的生成函数:
四、 根据高中知识,我们可以知道,多次表达式的分数形式可以转化为低次表示式的和的形式
进一步可以得到:
然后将结果带入公式,去除掉 R 和 S,可得:
五、 级数展开公式
根据大学级数公式,我们可知:
带入第四步中的公式可得:
于是,我们得到了 斐波那契 数列的通项公式为:
而 r 与 s又满足条件:
所以可以计算得出:
因为,我们最终可以得出 斐波那契 数列的通项公式为:
此时,我们使用C语言重新实现,代码如下:
int result2(int index) { return (int)(((pow((1 + sqrt(5.0)) / 2, index) - pow((1 - sqrt(5.0)) / 2, index)) / sqrt(5.0)));}
然后观察打印结果:
可以看出,计算结果一直,但是运行时间却快了六万多倍。。。
从这里,我们可以看出,在实现编程的时候,可以首先考虑利用数学方法优化程序设计或者计算!!!!
- 斐波那契数列数列计算
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- OC的类和对象
- handler机制的原理
- 安装bcrypt报错node-gyp rebuild解决方法
- Lua学习Day01
- 再次来到上海,希望这次能坚持下去
- 斐波那契数列
- 如何让ubuntu开机进入纯命令模式
- Linux C判断两个IPv6地址是否相等的方法
- 手机版同步html几点注意使用
- Java NIO 同步非阻塞Socket DEMO
- 面向对象三大特性
- 在Ubuntu上安装Wine
- CodeForces 630 E. A rectangle(水~)
- 【Linux 基础篇】之常用命令