引子:(以下所有代码结果不尽相同,只需使得n++,或n--,即可得到符合数列的数)
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:该数列指的是这样的一列数字:1、1、2、3、5、8、13、21、34、55、89、144、233、377、610、987、1597、2584、4181、6765、10946、17711、28657、46368…在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)。还有一个公式,若求第N(不是很大,否者超过longlong范围)项,可用公式直接算出:
兔子问题
在第一个月有一对刚出生的小兔子,在第二个月小兔子变成大兔子并开始怀孕,第三个月大兔子会生下一对小兔子,并且以后每个月都会生下一对小兔子。 如果每对兔子都经历这样的出生、成熟、生育的过程,并且兔子永远不死,那么兔子的总数是如何变化的?
(图片侵删)
显然,符合上述递推公式。可以用比较基础的方法解决。
#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include <algorithm>
#define ll unsigned long long
using namespace std;
int main()
{
ll n,m;
ll a0=0,a1=1;ll i;
cin>>n;
for( i=0;i<n;i+=2)
{
a0=a0+a1;
a1=a0+a1;
}
if(i==n) cout<<a1<<endl;
else cout<<a0<<endl;
}
也许许多人觉得,斐波那契数列不过是浩如烟海的数学海洋中的一滴水。但是实际上,从这个数列被提出的那一天起,几百年来人们在许多领域都发现了它的影子。————李永强
生活中上台阶问题
如果我们要上一个N级台阶的楼梯,每次只能走1格或者2格,那么一共有多少种走法呢?
若n很小,可用递归(具体讲解在我的博客分类——基础算法中)
#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include <algorithm>
using namespace std;
typedef long long ll;ll s;
int jc(ll x);
int main()
{
ll n,m;
cin>>n;
cout<<(jc(n));
}
int jc(ll x)
{
if(x==0||x==1) return 1;//边界很重要
else return jc(x-1)+jc(x-2);
}
他自然也符合上述递推公式,但若N比较大,即使用long long也会超过范围,要考虑别的方法。
留白
斐波那锲数列的推广————卢卡斯数列
该数列指的是这样一串数列:1,3,4,7,11,18,............
斐波那锲数列与卢卡斯数列中的一些规律:
斐波那锲数列:连续的十个菲波那切数列的和,是这10个数中第7个数的11倍。
卢卡斯数列:前N项的和等于第n+2项减去第2项。(第2项是3)
斐波那契数列的常用性质
以下转自- - - >点我
1、 gcd( F [ n + 1 ] , F [ n ] ) = 1
证明:
根据辗转相减法则
gcd (F [ n + 1 ] , F [ n ] )
= gcd (F [ n + 1 ] - F [ n ] , F[ n ])
= gcd ( F [ n ] , F [ n - 1 ] )
= gcd ( F [ 2 ] , F [ 1 ] )
= 1
2、 F [ n + m ] = F [ n ] * F [ m + 1 ] + F [ n - 1 ] * F [ m ]
证明:
F [ n + m]
= F [ n+ m - 1] +F [ n + m - 2 ]
= 2 * F [ n + m - 2 ] + F [ n + m - 3 ]
= 3 * F [ n + m - 3 ] + 2 * F[ n + m - 4 ]
= 5 * F [ n + m - 4 ] + 3 * F[ n + m - 5 ]
= 8 * F [ n + m - 5 ] + 5 * F[ n + m - 6 ]
= ······
= F [ x + 1 ] * F [ n + m - x ] + F[ x ] * F [ n + m - (x + 1) ]
当 x == m 时 : F [ n + m ] = F [ m + 1 ] * F [ n ] + F [ m ] * F [ n - 1 ]
3、gcd ( F [ n + m ] , F [ n ] ) = gcd( F [ n ] , F [ m ] )
证明:
gcd ( F [ n + m ] , F [ n ] )
= gcd ( F [ n + 1 ] F [ m ] + F [ n ] F [ m - 1 ] , F [ n ] ) //根据2
= gcd ( F [ n +1 ] F [m ] , F [ n ] )
= gcd ( F [ n + 1 ] , F [ n ] ) * Gcd ( F [ m ], F[ n ] ) //根据1
= gcd ( F [ m ] , F [ n ] )
4、gcd ( F[ n ] , F[ m ] ) = F[ gcd ( n , m ) ]
设斐波那契数列第x项为F[x]
则有结论gcd ( F [ n ] , F [ m ] ) = F [ gcd ( n ,m ) ]
证明:
由3得:
gcd ( F [ m ] , F [ n ] )
= gcd ( F [ m - n ] , F [ n ] )
= gcd ( F [m - 2 * n ], F [ n ] )
= gcd ( F [ m % n ] , F [ n ] )
根据代换和递归的思想,其实上边的公式就是辗转相除法gcd(m, n)
所以:gcd ( F[ n ] , F[ m ] ) = F[ gcd ( n , m ) ]