斐波那契数列是一个非常美丽、和谐的数列,有人说它起源于一对繁殖力惊人、基因非常优秀的兔子,也有人说远古时期的鹦鹉螺就知道这个规律。
斐波那契数列由如下递推关系式定义:
F(n)={0if n = 01if n = 1F(n−1)+F(n−2)if n >1F(n) = \begin{cases}
0 & \text{if n = 0}\\
1 & \text{if n = 1}\\
F(n-1)+F(n-2) &\text{if n >1}
\end{cases}
F(n)=⎩⎪⎨⎪⎧01F(n−1)+F(n−2)if n = 0if n = 1if n >1
int Fibonacci (int n)
{
if (n <= 0) return 0;
else if (n == 1) return 1;
else return Fibonacci(n - 1) + Fibonacci(n - 2);
}
求解通项公式
由递推公式 F(n)=F(n−1)+F(n−2),我们知道F(n)的特征方程为:F(n) = F(n-1) + F(n-2),我们知道F(n)的特征方程为:F(n)=F(n−1)+F(n−2),我们知道F(n)的特征方程为:
x2=x+1x^2 = x + 1 x2=x+1
有根:X1,2=1±52X_{1,2} = \frac{1\pm\sqrt{5}}{2}X1,2=21±5
所以存在$A,B $ 使得:
F(n)=A×(1+52)n+B×(1−52)nF(n) = A\times(\frac{1+\sqrt{5}}{2})^n+B\times(\frac{1-\sqrt{5}}{2})^nF(n)=A×(21+5)n+B×(21−5)n
代入F(0)=0,F(1)=1F(0) = 0,F(1) = 1F(0)=0,F(1)=1,解得A=55,B=−55A=\frac{\sqrt{5}}{5},B=-\frac{\sqrt{5}}{5}A=55,B=−55
F(n)=55×(1+52)n−55×(1−52)nF(n) = \frac{\sqrt{5}}{5}\times(\frac{1+\sqrt{5}}{2})^n-\frac{\sqrt{5}}{5}\times(\frac{1-\sqrt{5}}{2})^nF(n)=55×(21+5)n−55×(21−5)n
通过公式,我们可以在O(1)的时间内得到F(n)。但公式中引入了无理数,所以不能保证结果的精确。
扩展问题
假设A(0)=1,A(1)=2,A(2)=2.对于n>2,都有A(k)=A(k−1)+A(k−2)+A(k−3)假设A(0) = 1, A(1) = 2, A(2) = 2.对于n>2,都有A(k) = A(k-1) + A(k-2) + A(k-3)假设A(0)=1,A(1)=2,A(2)=2.对于n>2,都有A(k)=A(k−1)+A(k−2)+A(k−3)
- 对于任何一个给定的n,如何计算出A(n)?对于任何一个给定的n,如何计算出A(n)?对于任何一个给定的n,如何计算出A(n)?
- 对于n非常大的情况,如n=260的时候,如何计算A(n)mod M(M<100000)呢?对于n非常大的情况,如n = 2^{60}的时候,如何计算A(n) \mod M (M\lt100000)呢?对于n非常大的情况,如n=260的时候,如何计算A(n)modM(M<100000)呢?
由递推公式 A(k)=A(k−1)+A(k−2)+A(k−3),我们知道A(n)的特征方程为:A(k) = A(k-1) + A(k-2) + A(k-3),我们知道A(n)的特征方程为:A(k)=A(k−1)+A(k−2)+A(k−3),我们知道A(n)的特征方程为:
x3=x2+x+1x^3 = x^2+ x + 1 x3=x2+x+1
所以存在A,B,CA,B,CA,B,C使得:
A(n)=−A+B×(1+52)n+C×(1−52)nA(n) = -A+B\times(\frac{1+\sqrt{5}}{2})^n+C\times(\frac{1-\sqrt{5}}{2})^nA(n)=−A+B×(21+5)n+C×(21−5)n
解得:
A(n)=43+5−16×(1+52)n−5+16×(1−52)nA(n) = \frac43 + {\sqrt{5}-1\over6}\times(\frac{1+\sqrt{5}}{2})^n-{\sqrt{5}+1\over6}\times(\frac{1-\sqrt{5}}{2})^nA(n)=34+65−1×(21+5)n−65+1×(21−5)n