记得本科学习《数据结构与算法》时,第一次遇到了斐波那契数列,之后在王道的考研书上又一次看到了它,但是当时的了解只限于它是递归求解的,以及它的公式:f(n) = f(n - 1) + f(n - 2), 结束条件是f(1) = 1, f(2) = 1。直到昨天携程测开的笔试题中遇到小海豚繁殖问题(经典的小兔子繁衍问题),在网上查资料的过程中,才开始逐渐体会到斐波那契的魅力。
无死亡繁殖问题
问:兔子三个月起每个月生一只小兔子,小兔子长到三个月后每个月有生一直兔子,假如兔子都不死,那么第一个月从一只小兔子到N个月后,问兔子的总数为多少?
分析:
第1个月: 1 只 (f(1) = 1)
第2个月: 1 只 (f(2) = 1)
第3个月: 2 只 (f(1) + f(2))
第4个月: 3 只 (f(3) + f(2))
第5个月: 5 只 (f(4) + f(3))
…… ……
第n个月: f(n - 1) + f(n - 2)
就得到了斐波那契数列:1,1,2,3,5,8...... 斐波那契数列的规律是每一项都等于前两项的加和f(n) = f(n - 1) + f(n - 2)
虽然我们从数字的规律推出了斐波那契数列,已经可以变成直接求解了,但是还是要理解一下为什么从第三个月开始每个月的数据都是它之前两个月的和。
首先定义一个函数 f(i) 表示第i个月的兔子数目。
在第 i - 2 月存在(可能是该月生的,也可能不是)的小兔子在第 i 月都能生兔子,即第 i 月新生的兔子为 f(i - 2)。而在第i - 1月的小兔子(可能是新生的,也可能跟i - 2月存在的兔子有重叠)会活到第i月,因为题目假设不死亡。因此第i月的兔子为f(i) = f(i - 1) + f(i - 2)。接下来代码就很简单了。
def fib(n): if n<=2: return 1 else: return fib(n-1)+fib(n-2) i = int(input("输入月:")) print("%d月后兔子的数量为:%d"%(i,fib(i)))
代码来自:https://blog.csdn.net/sinat_41597065/article/details/100567046
一篇讲解斐波那契数列的好文:https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/82891840