斐波那契数列(Fibonacci Sequence)

来自编程技术交流中心(QQ群:167998652)——StarSky_STZG
本文链接: https://blog.csdn.net/weixin_43272781/article/details/102528319

基本概念

斐波那契数列(Fibonacci Sequence):斐波那契数列(Fibonacci Sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

算法

1、递归法

2、递推法

3、快速矩阵幂

源代码

一、递归法

C++版本一 

#include <stdio.h>
#include <stdlib.h>
//获取第n项斐波那契数列值 
int fn(int n){
    int i;
    if(n==1||n==2)
        return 1;
    else
        return fn(n-1)+fn(n-2);	
}

int main(int argc, char *argv[]) {
    int n;
    while (scanf("%d",&n)!=EOF)
    {	int i;
        for(i=1;i<n;i++){
            printf("%d ",fn(i));
        }
        printf("%d\n",fn(i));
    }
    return 0;
}
		    

 Python版本一

# 递归
def fibonacci(i):
    num_list = [0, 1]
    if i < 2:
        return num_list[i]
    elif i >= 2:
        return (fibonacci(i - 2) + fibonacci(i - 1))


print(fibonacci(10))

2、递推法

C++版本一 

#include<stdio.h>
int main()
{
	int a = 1;
	int b = 1;
	int c = 0;
	int n = 0;
	int i = 0;
   scanf(“%d”,&n);
	for (i = 0; i <= n; i++)
	{
		c = a + b;
		a = b;
		b = c;
	}
	printf("%d", c);
	system("pause");
	return 0;
}

Python版本一

a,b=0,1
while a<1000:
    print(a,end=',')
    a,b=b,a+b

Python版本二 

# Python特有, 常规写法
def fib(self, n):
	a = 0
	b = 1
	while a <= n:
		print(a, end=" ", flush=True)
		a, b = b, a + b  # python不借助变量交换两数的值

fib(100)  # 求n之内的斐波那契数列

3、快速矩阵幂

C++版本一 

/*
*@Author:   STZG
*@Language: C++
*/
//#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,u,v;
int ans,cnt,flag,temp,sum;
int b[2][2];
int a[2][2];
char str;
struct node{};
void Matrix(int a[2][2],int b[2][2]){
    int c[2][2];
    memset(c,0,sizeof(c));
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            for(int k=0;k<2;k++){
                c[i][j]=(c[i][j]+a[i][k]*b[k][j])%10000;
            }
        }
    }
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            a[i][j]=c[i][j];
        }
    }
}
int power(int k){
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            a[i][j]=1;
            b[i][j]=1;
        }
    }
    a[0][0]=b[0][0]=0;
    while(k){
        if(k&1)Matrix(a,b);
        Matrix(b,b);
        k>>=1;
    }
    return a[0][0];
}
int main()
{
#ifdef DEBUG
	freopen("input.in", "r", stdin);
	//freopen("output.out", "w", stdout);
#endif
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    //cout.tie(0);
    //
    while(~scanf("%d",&n)&&n!=-1){
        cout<<power(n)<<endl;
    }
 
#ifdef DEBUG
	printf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif
    //cout << "Hello world!" << endl;
    return 0;
}

例题

http://poj.org/problem?id=3070

参考文章

https://blog.csdn.net/weixin_43272781/article/details/88960037

https://blog.csdn.net/chichu261/article/details/83589767

猜你喜欢

转载自blog.csdn.net/weixin_43272781/article/details/102528319