关于斐波那契数列引发的一系列思考
斐波那契数列是一个神奇的数列!
先来讲两个经典的问题,你们也可以思考一下答案,通过看完本文希望你可以回答出答案。
兔子问题
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
台阶问题
有一段楼梯有20级台阶,规定每一步只能跨一级或两级,要登上第20级台阶有几种不同的走法?
以上两个问题都和斐波那契数列有关。不信?那我们来分析一下。
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对
两个月后,生下一对小兔对数共有两对
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对
------
依次类推可以列出下表:
幼仔对数=前月成兔对数
成兔对数=前月成兔对数+前月幼仔对数
总体对数=本月成兔对数+本月幼仔对数
再来分析一*阶问题
登上第一级台阶有一种登法;登上两级台阶,有两种登法;登上三级台阶,有三种登法;登上四级台阶,有五种登法……
仍然是这串数字0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233…
两个不同的问题却拥有相同的规律
神奇么?其实这才是冰山一角而已。
再来看看下面这个植物
上面的凸起也符合斐波那契数列规律!
斐波那契数列中的斐波那契数会经常出现在我们的眼前——比如松果、凤梨、树叶的排列、某些花朵的花瓣数(典型的有向日葵花瓣),蜂巢,蜻蜓翅膀,超越数e(可以推出更多),黄金矩形、黄金分割、等角螺线,十二平均律等。
符合斐波那契数与植物花瓣
3………………………百合和蝴蝶花
5………………………蓝花耧斗菜、金凤花、飞燕草、毛茛花
8………………………翠雀花
13………………………金盏
21………………………紫宛
34、55、89……………雏菊
**斐波那契数还可以在植物的叶、枝、茎等排列中发现。**例如,在树木的枝干上选一片叶子,记其为数0,然后依序点数叶子(假定没有折损),直到到达与那些叶子正对的位置,则其间的叶子数多半是斐波那契数。叶子从一个位置到达下一个正对的位置称为一个循回。叶子在一个循回中旋转的圈数也是斐波那契数。在一个循回中叶子数与叶子旋转圈数的比称为叶序(源自希腊词,意即叶子的排列)比。多数的叶序比呈现为斐波那契数的比。
斐波那契数列还和黄金比例有关,所以又称黄金分割数列
这样一个完全是自然数的数列,通项公式却是用无理数来表达的。而且当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618.(或者说后一项与前一项的比值小数部分越来越逼近黄金分割0.618、前一项与后一项的比值越来越逼近黄金分割0.618)
1÷1=1,1÷2=0.5,2÷3=0.666…,3÷5=0.6,5÷8=0.625,…………,55÷89=0.617977…,…………144÷233=0.618025…46368÷75025=0.6180339886……
越到后面,这些比值越接近黄金比。
斐波那契的秘密远远不止于此,它更多的秘密还需要后人来揭开。我试图用编程的方式去探索其中的奥秘。而善于科学计算的python语言无疑是我的首选。
计算代码如下:
a=0
b=1
n=0
m=0
while b<10000:
print(b)
n=b
m=a+b
a=n
b=m
这是最为直接的方式,但很明显不够优美,稍加观察我们就会得出下面的代码:
a,b = 0,1
while b<10000:
print(b)
a,b = b,a+b
这下看起来就舒服多了
简单说明一下原理:其中代码关键部分a,b=b,a+b的计算方式为先计算右边表达式,然后同时赋值给左边。
以上程序的执行结果为
但这显然仍不是我们想要的,因为我们想计算的是一年之后的兔子,20级台阶的走法,但我们并不能直观的通过上面的数字得到我们想要的答案。所以我用生成器写了下面一段代码:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
def fibonacci(n): # 生成器函数 - 斐波那契
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()
通过修改n也就是生成器参数,我们就能获得我们想要的次数了。
关于斐波那契我想还有很多值得思考的地方,日后再说吧!