Python斐波那契数列应用讲解

起源

斐波那契数列,又称黄金分割数列 / 兔子数列;起源于斐波那契发现的兔子繁殖问题(具体分析过程的链接见文末),网址有点长,但内容很详细,哈哈哈。

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,…该数列最大的特征在于: 从第三项开始,每一项的值都等于前两项之和;

代码实现

简单的代码实现如下所示:

#函数定义
def feibo(n):
    a,b = 0,1
    # while循环的终止条件为 b>= n
    while b < n:
        # end = ' '表示不换行,输出结果以一个空格隔开,此处可自定义
        print(b, end=' ')
        a,b = b, a + b
    # 下行语句表示:等while循环结束后换行
    print()
    
#函数调用
feibo(10)

执行结果如下所示:

1 1 2 3 5 8 

需要注意的是代码中的 n 所表示的含义,上述 n = 10, 表示小于10范围内的斐波那契数列值,并非斐波那契数列第10项的值;

应用:小矩形覆盖大矩形

应用1:可以用2×1的小矩形横着或竖着去覆盖更大的矩形。请问用n个2×1的小矩形无重叠地覆盖一个2×n的大矩形,总共有多少种覆盖方法?请用递归的方式实现?

应用1思路分析

1 2
3 4

此处用12(34)表示2(长)×1(宽)的小矩形,13(24)表示1(长)×2(宽)的小矩形;

上表格中的 n = 2,即用2个2×1的小矩形无重叠地覆盖一个2×2的大矩形;

现设 n = 列数,r = 覆盖结果的种数;

1 2 3 4 5 6
7 8 9 10 11 12

分析可得,当 n = 0 时,r = 0;
n = 1 时,r = 1;
n = 2时,r = 2;
n = 3时,r = 3;
简单分析为当有2列时,有2种覆盖结果;(两列17/28)和(两行12/78)
当有3列时,有3种覆盖结果;(3列13/28/39)和(一列两行17/23/89)和(两行一列12/78/39)

再分析,当n = 4时,有两种情况:
(1)当竖放即以列为单位时,后三列情况为n=3的结果,即r=3;
(2)当横放即以行为单位时,剩余后两列为n=2的结果,即r=2
所以,当n=4时,可覆盖的情况有3+2=5种;

以此类推,可总结出如下公式 : f(n) = f(n-1) + f(n-2)

应用1代码实现

于是,以递归方式实现该题的代码如下:

def rectConvert1(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    elif n == 2:
        return 2
    else:
        return rectConvert1(n-1) + rectConvert1(n-2)
print(rectConvert1(6))

执行结果如下所示:

13

需要注意的是:上述代码中的 n 表示列数(也可理解为第n项的值),即有6列表格时,有13种覆盖情况(f(6) = f(5)+f(4) = f(4)+f(3)+f(3)+f(2) = f(3)+f(2)+f(3)+f(3)+f(2) = 3f(3)+2f(2)= 9+4 = 13);

应用2:请用非递归的方式实现第1题

应用2思路分析

当用非递归方式实现时,只需修改else的代码块,将斐波那契数列值保存在一个列表中,取第n项的值即可;

应用2代码实现

def rectConvert2(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    elif n == 2:
        return 2
    else:
        res = [0,1,2]
        while len(res) <= n:
            # 计算当前列表的倒数第一个值和第二个值的和
            res.append(res[-1]+res[-2])
        return res[n]

print(rectConvert2(6))

代码的执行结果如下所示:

13

常见的问题也可是:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(具体答案后期揭晓)

注:兔子繁殖问题分析详解可浏览:https://mp.weixin.qq.com/s?src=11&timestamp=1581424112&ver=2152&signature=pzB-FaTI5sthz3EeISxwOsHKg-wxKYsp4KInQSAZHTgB066mHxW84REKg7PNXn6QlMJ9p04j1y2*HTPUX5eRt4GwPhbhqg7qwUvX7YmLbF28qh-bEDPqDAhjy4ekc9fH&new=1

https://mp.weixin.qq.com/s?src=11&timestamp=1581424112&ver=2152&signature=pzB-FaTI5sthz3EeISxwOsHKg-wxKYsp4KInQSAZHTgB066mHxW84REKg7PNXn6QlMJ9p04j1y2*HTPUX5eRt4GwPhbhqg7qwUvX7YmLbF28qh-bEDPqDAhjy4ekc9fH&new=1

发布了21 篇原创文章 · 获赞 6 · 访问量 8002

猜你喜欢

转载自blog.csdn.net/weixin_42128329/article/details/104268045