Python数据结构与算法——第六课 斐波那契数列

  斐波那契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:

1, 1, 2, 3, 5, 8, 13, 21,…

从第3个数开始,每个数都是前两个数的和。

  例题1:递归求斐波那契数列中的前n1≤n≤100)项。

  解题思路如下:这个问题比较复杂,优先考虑递归法(递归比较接近人类的思维习惯)。n项=(n-1)+ (n-2)项,是一个相邻项双重递归问题,第一第二项都必须已知,实际第一第二项都是1,问题可解。虽然实际的递归计算过程有点复杂,但难不倒计算机的。   

 

  运行结果:

 

 

  例题2:循环求斐波那契数列中的前n1≤n≤100)项。

  分析:用两个临时变量滚动缓存倒数1和2项就可以实现循环求解。

 

 

  兔子繁殖问题:如果一对兔子从出生后第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子。并假设兔子都不会死,开始是1对兔子,第n1≤n≤100)个月将会有多少对兔子?

  算法分析如下:

1个月:1对兔子                                   =1

2个月:1对兔子                                   =1

3个月:1对兔子+新生1对兔子             =2

4个月:2对兔子+新生1对兔子             =3

5个月:3对兔子+新生2对兔子             =5

6个月:5对兔子+新生3对兔子             =8

7个月:8对兔子+新生5对兔子             =13

......

  上面等式左侧第1项是原先累计下来的兔子(等于上个月的兔子数量),第2项是当月新生的兔子(等于上上个月的兔子数量)。可见,第三个月后,兔子的数量关系符合:

当月数量=上月数量+上上月数量。

  兔子数量符合斐波那契数列规则,用上面的斐波那契数列的运算程序即可求解。

  数列无疑是一种数据结构,这种数据结构的数据元素之间的关系是数量关系。一般数列的项要么是确定的原始项,要么与它前面的1项或多项有数量关系。数学上一般要求解通项公式(数列项对于项序数的函数),但计算机解决问题不需要通项公式,只需要把数列项的数量关系用递归或循环代码描述出来,与这个数列有关的具体问题就可以解决了。可见计算机在解决数列的实际问题有极大优势,同时也能为数列通项公式的研究提供帮助。

  例题3:同样是兔子繁殖问题,如果一对兔子从出生后第4个月起每个月都生一对兔子,小兔子长到第4个月后每个月又生一对兔子。并假设兔子都不会死,开始是1对兔子,第n1≤n≤100)个月将会有多少对兔子?

  算法分析如下:

1个月:1对兔子                                   =1

2个月:1对兔子                                   =1

3个月:1对兔子                                   =1

4个月:1对兔子+新生1对兔子             =2

5个月:2对兔子+新生1对兔子             =3

6个月:3对兔子+新生1对兔子             =4

7个月:4对兔子+新生2对兔子             =6

8个月:6对兔子+新生3对兔子             =9

9个月:9对兔子+新生4对兔子             =13

10个月:13对兔子+新生6对兔子         =19

......

  上面等式左侧第1项是原先累计下来的兔子(等于上个月的兔子数量),第2项是当月新生的兔子(等于上上上个月的兔子数量)。可见,第4个月后,兔子的数量关系符合:

当月数量=上月数量+上上上月数量。

  递归法代码:

 

  循环法代码:

 

  运行结果:

 

  练习题1:同样是兔子繁殖问题,如果一对兔子从出生后第5个月起每个月都生一对兔子,小兔子长到第5个月后每个月又生一对兔子。并假设兔子都不会死,开始是1对兔子,第n1≤n≤100)个月将会有多少对兔子?

 

参考资料:

1、《Python算法图解》何韬编著 清华大学出版社