【数据结构与算法】Fibonacci Sequence
学计算机的对 Fibonacci 都并不陌生,在课堂上一讲到递归几乎都会提到 Fibonacci 数列。不久前,我对 Fibonacci 产生了一些兴趣,就在这里把自己的想法给记录下来。
递推公式:
通项公式:
我们还是以最原始的兔子问题为例子:
第一个月有一对兔子,兔子呢按照这种规律生长:当一对兔子两个月成熟后,以后每个月就会出生一对兔子。而且兔子不会死亡。
为了方便区分,我们分别用一个符号来指代兔子的年龄:口 --> 0月,日 --> 1月,目 --> 2月。f(n)代表第 n 月。
f(n) | f(1) | f(2) | f(3) | f(4) | f(5) | f(6) | f(7) | f(8) | f(9) | ... |
---|---|---|---|---|---|---|---|---|---|---|
口 | 1 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | ... |
日 | 0 | 1 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | ... |
目 | 0 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | ... |
由以上表格可以得出:
- 除去一月每一个的口和目的数量是相等的。
- 每一个月的目来自于上一个月的日和目的和。
- 每一个月的日来自于上一个月的口。
则有:
f(n)=口(n)+日(n)+目(n)
=2*(日(n-1)+目(n-1))+口(n-1)
=f(n-1)+日(n-1)+目(n-1)
=f(n-1)+口(n-2)++日(n-2)+目(n-2)
=f(n-1)+f(n-2)
当然使用数学归纳法证明会更加方便。
像生活中的有些问题都可以用 Fibonacci 数列解决,例如:爬楼梯
我们爬楼梯一般都是走一个阶梯或者是跨两个阶梯。
那我现在要问了:如果有n层阶梯,想在依照上面的走法,请问有多少种不同的方法,可以刚好到达顶层呢?
首先分析简单情况:
阶梯数 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
1 | 11 | 111 | 1111 | 11111 | 111111 | |
2 | 21 | 211 | 2111 | 21111 | ||
12 | 121 | 1211 | 12111 | |||
112 | 1121 | 11211 | ||||
22 | 1112 | 11121 | ||||
221 | 11112 | |||||
212 | 1122 | |||||
122 | 2211 | |||||
1221 | ||||||
2112 | ||||||
1212 | ||||||
2121 | ||||||
总和 | 1 | 2 | 3 | 5 | 8 | 13 |
怎么样下面的数列是不是有点熟悉如果在前面加个1,则为:1,1,2,3,5,8,13。。。
或者可以这样理解它们相邻的差刚好为1,1,2,3,5,8,13。。。
又或者可以看成:前一个数的两倍减去后一个数就成为以零开头的 Fibonacci 数列:0,1,1,2,3,5,13。。。
- 2=1*2-0
- 3=2*2-1
- 5=3*2-1
- 8=5*2-2
- 13=8*2-3
- 21=13*2-5
反正不管是什么样的规律都会相似于 Fibonacci 数列。或许这仅仅只是个数学巧合吧,具体我也没深究,只是发现了这一规律。