数列描述:
(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}})
构造出这个数列之后,求解很容易,问题是:这个构造数列是如何想到的?
其实,构造的方法一般来说都是固定的。比如,高中时候常见的构造 “等比数列和常数” 这一整体为一个等比数列。稍微深入类比一下即可。 -
使用矩阵运算
(egin{bmatrix} f_{n - 1} \ f_n end{bmatrix} = egin{bmatrix} 0 & 1 \ 1 & 1 end{bmatrix} egin{bmatrix} f_{n - 2} \ f_{n - 1} end{bmatrix} = {egin{bmatrix} 0 & 1 \ 1 & 1 end{bmatrix}}^n egin{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