斐波那契数列
1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 377 , . . . 1,1,2,3,5,8,13,21,34,55,89,144,233,377,... 1,1,2,3,5,8,13,21,34,55,89,144,233,377,...
这是斐波那契数列,通常用 F n F_n Fn表示它的第 n n n项
斐波那契数列是由意大利的一位奆佬数学家列奥纳多·斐波那契发现的。这位奆佬在研究兔子繁殖时发现了这样一个数列,故斐波那契数列又称"兔子数列"
斐波那契数列有一个简单又深奥的规律: F n + 1 = F n + F n − 1 F_{n+1}=F_n+F_{n-1} Fn+1=Fn+Fn−1,递推形成。也就是,斐波那契数列每一项都是前两项之和。
如果将递推公式转化成通项公式的话,是一个很复杂的式子:
F n = 1 5 [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] F_n=\dfrac1{\sqrt5}[(\dfrac{1+\sqrt5}2)^n-(\dfrac{1-\sqrt5}2)^n] Fn=51[(21+5)n−(21−5)n]
我:这是什么鬼?
由于这个通项公式太过复杂,所以一般在求斐波那契数列时还是用递推公式。
下面为标准求 F n F_n Fn的代码,时间复杂度 O ( N ) O(N) O(N)
unsigned Fibonacci(int n)
{
if(n==1) return 1;
if(n==2) return 1;
if(f[n-1]>0&&f[n-2]>0)
{
return f[n-1]+f[n-2];
}
else
{
f[n-1]=Fibonacci(n-1);
f[n-2]=Fibonacci(n-2);
return f[n-1]+f[n-2];
}
}
由于斐波那契增长速度很快,前 50 50 50项已经无法用int
放下,而前 100 100 100项就需要高精度。
斐波那契数列的性质
斐波那契数列的最大的性质就是满足 F n + 1 = F n + F n − 1 F_{n+1}=F_n+F_{n-1} Fn+1=Fn+Fn−1
由这个性质,可以推出许多有意思的性质
假设 F m = a , F m + 1 = b F_m=a,F_{m+1}=b Fm=a,Fm+1=b,根据上述式子, F m + 2 = a + b , F m + 3 = a + 2 b , F m + 4 = 2 a + 3 b , . . . F_{m+2}=a+b,F_{m+3}=a+2b,F_{m+4}=2a+3b,... Fm+2=a+b,Fm+3=a+2b,Fm+4=2a+3b,...
列出一张表格,表示 F m + k F_{m+k} Fm+k中含有多少个 a a a和 b b b
m m + 1 m + 2 m + 3 m + 4 m + 5 m + 6 m + 7 m + 8 . . . a 1 0 1 1 2 3 5 8 13 . . . b 0 1 1 2 3 5 8 13 21 . . . \begin{matrix}& m&m+1&m+2&m+3&m+4&m+5&m+6&m+7&m+8&... \\ a&1&0&1&1&2&3&5&8&13&...\\ b&0&1&1&2&3&5&8&13&21&... \end{matrix} abm10m+101m+211m+312m+42