小朋友,你能吃几个粽子?

599 阅读2分钟

我正在参加「初夏创意投稿大赛」详情请看:初夏创意投稿大赛

前言

端午节马上来临,我们一提到端午节,就会立刻想到吃粽子,有红枣糯米,有牛肉粽子,猪肉粽子等等,小王最喜欢吃的就是红枣糯米,做熟了之后放到井水中浸凉的粽子,吃起来软糯香甜,回味无穷。但是小王同学随着身体成长,胃口越来越大,端午第一天能吃 1 个粽子,端午第二天还能吃 1 个粽子,从端午第三天开始之后的每一天吃的粽子数量是之前两天的总和,请问小王在第 n 天能吃几个粽子?

思路

小王吃粽子的胃口很明显符合斐波那契数列,从问题中我们可以看出来小王每天吃粽子的个数为 1、 1、 2、 3、 5、 8、 13、 21、34 ...... ,我们很容易就推出这个数列的递推关系:

F(n) = F(n-1) + F(n-2)

由于已知了上述的递推关系,所以我们可以使用动态规划或者遍历的方式来进行求解,我们在初始化的时候只需要定义好 F(1) 和 F(2) 即可,后面只需要通过递推关系公式,直接进行计算即可。

时间复杂度为 O(N) ,空间复杂度为 O(N) 。

方案一

因为递推公式里都是函数 f 组成的,所以符合递归函数的形式,我们第一种方法使用递归的形式来解题。

def Fibonacci(n):
    if n<2: return n
    return Fibonacci(n-1) + Fibonacci(n-2)

方案二

递推关系的整个顺序是随着时间从前向后的,所以我们也可以直接遍历进行求解,其实用到的就是滚动数组思想。

def Fibonacci(n):
    if n < 2: return n
    q = 0
    result = 1
    for i in range(2, n + 1):
        p, q = q, result
        result = p + q
    return result

结果

经过了一番算法的推导和计算,我们终于能知道小王吃粽子的胃口到底有多大了,一般端午佳节持续一个月,假如想要知道小王在第 30 天能吃多少个粽子,我们直接调用函数计算可得 832040 个粽子,小王的胃口真的好大啊!

尾记

以上内容纯属虚构,如有雷同,纯属巧合