关闭

斐波那契数列知识小结

334人阅读 评论(0) 收藏 举报
分类:


之前学习Python的时候第一次认真学习了一下斐波那契数列,也是我第一次认真研究了一下编程语言的基础知识。今天依然从Python入手吧,先把之前完成的斐波那契数列函数实现一下。

代码如下:

  1 #!/usr/bin/python

  2 

  3 defFib(n):

  4        if n==0or n ==1:

  5                return1

  6        else:

  7                return Fib(n -1) + Fib(n -2)

  8 


程序的执行结果如下:


>>> from fib import *

>>> Fib(1)

1

>>> Fib(2)

2

>>> Fib(3)

3

>>> Fib(10)

89

>>> Fib(24)

75025


按照Mooler老爷子的教程,斐波那契数列跟黄金分割是有一定的关联的。这部分我个人理解起来觉得略微复杂深奥了一点,捡一点自己能够看懂的大致描述应该为:

1,黄金分割求解时采用的迭代语句为 p = p + q的形式;

2,斐波那契数列求解采用的迭代语句为 f(k) = f(k -1) + f(k -2);

3,黄金分割求解可以采用无穷连分式表示(略);

如果取Phi为黄金分割连分式的前n项阶段结果,那么Phi = f(n) + f(n -1),在极限条件下,连续斐波那契数的比值趋近于黄金分割。看结果勉强能够看懂,但是如何通过推导或者是逻辑运算找出斐波那契与黄金分割的关系我个人觉得还是一个比较难的问题。或者说,我自己是毫无头绪。

这里做一个简单的验证吧!

由于之前我简单的做过斐波那契的程序编写与运行,我知道这个递归的层级是有限的。不过为了能够更能够贴近趋近于无穷大时候的效果,开始我选择了两个相对大一点的迭代结果,99与100。简单输入进行计算,计算机运行了漫长的时间还没有给出计算的结果,只好放弃。重新选择了39与40这两个迭代计算结果来做测试:


>>> fib_40 = Fib(40)

>>> fib_39 = Fib(39)

>>> fib_40

165580141

>>> fib_39

102334155

>>> float(fib_40)/float(fib_39)

1.618033988749895


最终的城市结果跟黄金分割的结果确实是比较相近。这个算法描述用MATLAB实现起来也没有什么太大的差异,计算的效率上也一样。不过,采用以下方式实现的MATLAB算法在计算上的效率可谓是“神算”级别。像Fib(100)这样的结果基本上也是瞬间就完成计算,按照教程中的说法,这种运算用到了MATLAB的矩阵运算,因此,虽说在代码形式上比不上递归的方式优雅,但是效率确实得到了大大的提升。


  1 function f = fibonacci(n)

  2 % fibonacci array

  3 % f = fibonacci(n)

  4 f=zeros(n,1);

  5 f(1) =1;f(2) =2;

  6 for k =3:n

  7     f(k) = f(k-1)+ f(k -2);

  8 end


在我看来,这两种方式似乎也没有太大的差异,除了后面这种计算每次的计算结果都以矩阵的形式进行了保存。似乎差异在于,前面的n次以矩阵形式保存的时候只会进行一次运算。使用Python能不能达到这种效果呢?如果使用列表的话似乎困难一些,或许还是得求助于numpy了。回头有时间还是得在numpy上花点时间,毕竟这个包成就了那么多的python包,甚至也在一定程度上成就了python。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

斐波那契数-从爬楼梯问题说开去

正式讲一下斐波那契数: 首先我们知道有一个著名的算法面试题: 一共有n个台阶,你一次可以走一个台阶,或者两个台阶。那么,走到台阶顶时,一共有多少种走法。 比如三个台阶,你可以 1,2。。。或者1,1,1 或者2,1。。一共三种走法。网络上会有几种做法, 1.直接思路: 这好像是这道题目的标...
  • bairongdong1
  • bairongdong1
  • 2016-08-22 01:54
  • 773

斐波那契数列的时间复杂度详释与改进方法

二阶常系数线性差分方程齐次差分方程二阶常系数线性差分方程的一般形式为: yn+ayn+1+byn=f(n),n=0,1,2,....(1−1)y_n+ay_{n+1}+by_n=f(n), n=0, 1, 2,....(1-1) 其中a,b为已知常数,且b≠0,f(n)为已知函数。其中a,b为已...
  • dawin_2008
  • dawin_2008
  • 2016-07-28 15:22
  • 1235

JAVA-递归-斐波那契数列

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,...
  • qq_37131111
  • qq_37131111
  • 2017-01-23 10:28
  • 2495

递归解决斐波那契数列

1、什么是递归?   递归:递归是方法定义调用方法本身的现象。递归举例如下: public class DiGuiDemo { //递归方法举例 public void show() { show(); } } 2、递归的注意事项? (1)递归一定要有出口。否则就会...
  • fightfaith
  • fightfaith
  • 2015-11-24 13:05
  • 1737

斐波那契数列-java编程:三种方法实现斐波那契数列

题目要求:编写程序在控制台输出斐波那契数列前20项,每输出5个数换行 //java编程:三种方法实现斐波那契数列 //其一方法: public class Demo2 { // 定义三个变量方法 public static void main(String[] args) { in...
  • DuHacker
  • DuHacker
  • 2015-09-08 19:45
  • 31662

斐波那契数列 递推 递归 备忘录 动态规划

当n=0时,f(n) = 0      当n=1时,f(n) = 1 当n>1时,f(n) = f(n-1) + f(n-2) 递归算法: [cpp] view plaincopy ...
  • judyge
  • judyge
  • 2015-04-17 11:21
  • 1001

面试题整理-斐波那契数列

这个很好。其实也就是f(0) = 0, f(1) = 1. 然后 f(n) = f(n-1) +  f(n-2); 测试链接点击打开链接。求解: #include #include long long a[71]; void init(void) { ...
  • JIEJINQUANIL
  • JIEJINQUANIL
  • 2016-09-02 22:52
  • 702

Python中斐波那契数列实现

Python中斐波那契数列实现 题目:说有一对可爱的兔子,出生后的第三个月开始, 每一月都会生一对小兔子。当小兔子长到第三个月后, 也会每个月再生一对小小兔子. 要求:假设条件,兔子都不死的情况下,问每个月的兔子总数为多少? 思路:兔子的规律为数列0,1,1,2,3,5,8,13,21.......
  • u014745194
  • u014745194
  • 2017-04-25 16:35
  • 1072

斐波那契数列高效递归求法

斐波那契数列高效递归求法
  • u012333003
  • u012333003
  • 2014-05-19 22:05
  • 927

斐波那契数列的最优算法(O(logN))

相信大家都对斐波那契数列已经相当的熟悉了,最多两分钟就可以写出来以下时间复杂度为O(N)的代码://递归实现 long long fib(int n) { if (n =1 || n== 2) { return&...
  • leex_brave
  • leex_brave
  • 2016-05-24 15:28
  • 2981
    个人资料
    • 访问:318252次
    • 积分:6846
    • 等级:
    • 排名:第3977名
    • 原创:399篇
    • 转载:0篇
    • 译文:0篇
    • 评论:9条
    文章分类
    最新评论