【数据结构与算法】Fibonacci Sequence

学计算机的对 Fibonacci 都并不陌生,在课堂上一讲到递归几乎都会提到 Fibonacci 数列。不久前,我对 Fibonacci 产生了一些兴趣,就在这里把自己的想法给记录下来。

递推公式:

f(n)=\left\{\begin{matrix} 1 & n=1 \\ 1 & n=1 \\ f(n-1)+f(n-2) & n>=3 \end{matrix}\right.

通项公式:

a_{n}=\frac{1}{\sqrt{5}}[(\frac{1+\sqrt(5)}{2})^{n}-(\frac{1-\sqrt(5)}{2})^{n}]


我们还是以最原始的兔子问题为例子:

第一个月有一对兔子,兔子呢按照这种规律生长:当一对兔子两个月成熟后,以后每个月就会出生一对兔子。而且兔子不会死亡。

为了方便区分,我们分别用一个符号来指代兔子的年龄:口 --> 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 数列。或许这仅仅只是个数学巧合吧,具体我也没深究,只是发现了这一规律。

posted @ 2019-04-20 11:12  1000sakura  阅读(121)  评论(0编辑  收藏