Fibonacci(斐波那契)数列方法整理

数列描述:

\(F_0 = 0, F_1 = 1, F_n = F_{n - 1} + F_{n - 2}\)

图形表示:

  • 递归实现
int fib(int n)
{
    if (1 == n || 2 == n)
        return 1;
    return fib(n - 1) + fib(n - 2);
}

缺点:存在大量重复运算,效率低下。

  • 使用迭代
int fib2(int n)
{
    int tmp1 = 1, tmp2 = 1, res;

    /*fib(n-1), fib(n-2), fib(n)*/
    if (n < 3)
        return (1);
    while (--n >= 2)
    {
        res = tmp1 + tmp2;
        tmp1 = tmp2;
        tmp2 = res;
    }
    return (res);
}
  • 其它方法

    • 构造新序列,令\(f_n + af_{n - 1} = b(f_{n - 1} + af_{n - 2})\),得到 \(a = \frac{\sqrt{5} - 1}{2}, b = \frac{\sqrt{5} + 1}{2}\),因此 \(f_n = \frac{b^n - a^n}{\sqrt{5}}\)

      构造出这个数列之后,求解很容易,问题是:这个构造数列是如何想到的?
      其实,构造的方法一般来说都是固定的。比如,高中时候常见的构造 “等比数列和常数” 这一整体为一个等比数列。稍微深入类比一下即可。

    • 使用矩阵运算

      \(\begin{bmatrix} f_{n - 1} \\ f_n \end{bmatrix} = \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix} \begin{bmatrix} f_{n - 2} \\ f_{n - 1} \end{bmatrix} = {\begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}}^n \begin{bmatrix} 0 \\ 1 \end{bmatrix}\)

附:1、如何计算 \(\frac{\sqrt{5} - 1}{2}\) ? 2、如何求矩阵的幂?
答:

另:用Python绘制的斐波那契螺线图

posted @ 2020-09-15 23:22  模糊计算士  阅读(226)  评论(0编辑  收藏  举报