斐波那契数列的几种实现方法

简介: 斐波那契数列的几种实现方法
/*递归*/ 
#include<bits/stdc++.h>
using namespace std;
int f(int x){
  if(x==0||x==1) return 1;
  else return f(x-1)+f(x-2);
}
int main(){
  int n;
  scanf("%d",&n);
  cout<<f(n)<<endl;
  return 0;
}
/*类似于辗转相除的依次赋值*/
// 0 1 1 2 3 5 8
#include<bits/stdc++.h>
using namespace std;
int main(){
  int n;
  cin>>n;
  int a = 0 , b = 1;
  int res ;
  if(n == 0) res = 0 ;
  else if(n == 1) res = 1;
  else{
    for(int i = 2;i <= n; i++){
      res = a + b;
      a  = b;
      b = res;
    }
  }
  cout<<res<<endl;
  return 0;
}
/*备忘录*/
#include<bits/stdc++.h>
using namespace std;
const int N = 1100;
int a[N];
int f(int x){
  if(a[x] >= 0) return a[x];//说明该值已经计算出
  else return a[x]=f(x-1)+f(x-2);//计算并存储
}
int main(){
  int n;
  cin>>n;
  memset(a, -1, sizeof a);
  a[0] = 0 , a[1] = 1;
  cout<<f(n)<<endl;
  return 0;
}

矩阵快速幂

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;
const int MOD = 1000000007;
void mul(int a[][2], int b[][2], int c[][2])
{
    int temp[][2] = {{0, 0}, {0, 0}};
    for (int i = 0; i < 2; i ++ )
        for (int j = 0; j < 2; j ++ )
            for (int k = 0; k < 2; k ++ )
            {
                long long x = temp[i][j] + (long long)a[i][k] * b[k][j];
                temp[i][j] = x % MOD;
            }
    for (int i = 0; i < 2; i ++ )
        for (int j = 0; j < 2; j ++ )
            c[i][j] = temp[i][j];
}
int f_final(long long n)
{
    int x[2] = {1, 1};
    int a[2][2] = {{1, 1}, {1, 0}};
    int res[][2] = {{1, 0}, {0, 1}};
    int t[][2] = {{1, 1}, {1, 0}};
    long long k = n - 1;
    while (k)
    {
        if (k&1) mul(res, t, res);
        mul(t, t, t);
        k >>= 1;
    }
    int c[2] = {0, 0};
    for (int i = 0; i < 2; i ++ )
        for (int j = 0; j < 2; j ++ )
        {
            long long r = c[i] + (long long)x[j] * res[j][i];
            c[i] = r % MOD;
        }
    return c[0];
}
int main()
{
    long long n ;
    cin >> n;
    cout << f_final(n) << endl;
    return 0;
}
作者:yxc
来源:AcWing

利用构造矩阵的方法(待补)原文链接

还有篇博客介绍了如何构造矩阵,但是现在没找到链接

补:斐波那契数列求和公式 : Sn = 2F(n) + F(n-1) - 1

求解斐波那契数列的若干方法 - AcWing

目录
相关文章
|
1月前
生成斐波那契数列的几种不同的方法
生成斐波那契数列的几种不同的方法
16 0
|
2月前
|
机器学习/深度学习 算法
|
9月前
斐波那契数列的几种写法 2021-02-23
斐波那契数列的几种写法 2021-02-23
|
9月前
|
机器学习/深度学习 开发工具
斐波那契数列的四种实现
在编程教程中提到斐波那契数列,通常都是用来讲解递归函数。当一个关于 N 的问题可以转换为关于 N - k 的同样问题时,它就可以尝试用递归的思路来解决。
|
10月前
|
机器学习/深度学习 存储 设计模式
从斐波那契数列到递归
大家好,我是王有志。今天我们要通过经典数学问【题斐波那契数列】来学习非常重要的编程技巧:递归。
87 1
从斐波那契数列到递归
|
10月前
|
机器学习/深度学习 算法
使用递归方法和for循环方法求阶乘
使用递归方法和for循环方法求阶乘
115 0
|
10月前
|
算法
斐波那契数列(递归+迭代)
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、3
91 0
Fibonacci斐波那契数列的几种题型
Fibonacci斐波那契数列的几种题型
74 0
|
算法 Windows
算法 | 详解斐波那契数列问题
算法 | 详解斐波那契数列问题
93 0
算法 | 详解斐波那契数列问题
|
算法 JavaScript 前端开发
☮斐波那契数列与动态规划
☮斐波那契数列与动态规划
88 0
☮斐波那契数列与动态规划