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、如何求矩阵的幂?
答:
- 1、计算 \(\frac{\sqrt{5} - 1}{2}\),见 https://www.cnblogs.com/fanlumaster/p/13678549.html
- 2、计算矩阵(确切来说,是方阵)的幂,见 https://www.cnblogs.com/fanlumaster/p/14162366.html