关于斐波那契数列引发的一系列思考

斐波那契数列是一个神奇的数列!
先来讲两个经典的问题,你们也可以思考一下答案,通过看完本文希望你可以回答出答案。

兔子问题
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?

台阶问题
有一段楼梯有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也就是生成器参数,我们就能获得我们想要的次数了。

关于斐波那契我想还有很多值得思考的地方,日后再说吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值