斐波那契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:
1, 1, 2, 3, 5, 8, 13, 21,…,
从第3个数开始,每个数都是前两个数的和。
例题1:递归求斐波那契数列中的前n(1≤n≤100)项。
解题思路如下:这个问题比较复杂,优先考虑递归法(递归比较接近人类的思维习惯)。n项=(n-1)项 + (n-2)项,是一个相邻项双重递归问题,第一第二项都必须已知,实际第一第二项都是1,问题可解。虽然实际的递归计算过程有点复杂,但难不倒计算机的。
运行结果:
例题2:循环求斐波那契数列中的前n(1≤n≤100)项。
分析:用两个临时变量滚动缓存倒数1和2项就可以实现循环求解。
兔子繁殖问题:如果一对兔子从出生后第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子。并假设兔子都不会死,开始是1对兔子,第n(1≤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对兔子,第n(1≤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对兔子,第n(1≤n≤100)个月将会有多少对兔子?
参考资料:
1、《Python算法图解》何韬编著 清华大学出版社