斐波那契的四种求法

首先看一下斐波那契的矩阵表示:

数列的递推公式为:f(1)=1,f(2)=2,f(n)=f(n-1)+f(n-2)(n>=3)

   用矩阵表示为:

  进一步,可以得出直接推导公式:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#define N 1000
using namespace std;

int f[N];
int fibonacci_1(int n){//递归
    if(n==1 || n==0) return 1;
    return fibonacci_1(n-1) + fibonacci_1(n-2);
}

int fibonacci_2(int n){//递推
    f[0] = f[1] = 1;
    for(int i=2; i<=n; ++i)
        f[i] = f[i-1] + f[i-2];
    return f[n];
}

int fibonacci_3(int n){//非递归
    int f1=1, f2=1, f3;
    for(int i=2; i<=n; ++i){
        f3 = f1+f2;
        f2 = f1;
        f1 = f3;
    }
    return f1;
}

struct Fibonacci{
    int a11, a12, a21, a22;
    Fibonacci(){
    }
    Fibonacci(int a1, int a2, int a3, int a4){
        a11 = a1;
        a22 = a2;
        a21 = a3;
        a22 = a4;
    }
    Fibonacci operator *(Fibonacci x){
        Fibonacci* tmp = new Fibonacci();
        tmp->a11 = a11*x.a11 + a21*x.a21;
        tmp->a12 = a11*x.a12 + a21*x.a22;
        tmp->a21 = a21*x.a11 + a22*x.a21;
        tmp->a22 = a21*x.a21 + a22*x.a22;
        return *tmp;
    }
};

int fibonacci_4(int n){//矩阵 + 快速幂方法
    Fibonacci a(1, 1, 1, 0);
    Fibonacci ans(1, 0, 0, 1);
    while(n){//快速幂方法
        if(n&1) ans = ans*a;
        a=a*a;
        n>>=1;
    }
    return ans.a11;
}
int main(){
    int n;
    cin>>n;
    cout<<"fibonacci_1: "<<fibonacci_1(n)<<endl;
    cout<<"fibonacci_2: "<<fibonacci_2(n)<<endl;
    cout<<"fibonacci_3: "<<fibonacci_3(n)<<endl;
    cout<<"fibonacci_4: "<<fibonacci_4(n)<<endl;
    return 0;
}
时间: 2024-08-28 03:16:46

斐波那契的四种求法的相关文章

斐波那契数列高效递归求法

时间:2014.05.19 地点:图书馆 ------------------------------------------------------------------- 一.简述 前面给出了一种斐波那契数列解法的矩阵幂方法,这是最高效的方法,时间复杂度为O(log).正常来说通过递推公式 F(n)=F(n-1)+F(n-2)直接来计算F(n)效率是很差的,因为这里会涉及很多冗余计算,比如求F(5),我们要求[F(4)和F(3)],[要求F(4)则得求F(3)和F(2),要求F(3)得求F

斐波那契的两种实现方式

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了<斐波纳契数列>季刊,专门刊载这方面的研究成果. #include<stdio.h> /* 解决斐波那契数列问题: 斐波那契数列指的是这样一个数列 0, 1,

斐波拉契数列的快速求法

由斐波拉契数列的公式:f(n)=f(n-1)+f(n-2),如果使用递归方法,非常的简短易懂,但是重复计算太多,时间复杂度成指数形势增长. 由矩阵乘法可以得到: 又 于是有 剩下的就是计算矩阵的过程了. 斐波拉契数列的快速求法

斐波那契数列两种时间复杂度

契数列 概述: 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以<斐波纳契数列季刊>为名的一份数学杂志,用于专门刊载这方面的研究成果. 求解: 求解斐波那契数列的F(n)有两种常用算法:递归算法和非递归算法.试分

Talking About斐波那契数列(三种实现方法)

一直学习数据结构和算法,虽然学的没有太好,但还是觉得应该做一些有意思的程序来实现以下~牛客网(大哥推荐,还有就是..不要问我大哥是谁~~)有剑指Offer系列很多的题目,不管是大神还是..应该去做一下,感受编程的魅力~~(首先承认自己还是有很多不足的地方,但尽量去完善每一行代码~)  废话少说,代码搞起~ import java.util.Scanner; /** * 现在要求输入一个整数n,请你输出斐波那契数列的第n项. * 斐波那契数列,又称黄金分割数列,指的是这样一个数列 0, 1, 1,

斐波那契数列三种实现(上台阶)-Python

1.递归 # 递归 def fibs(n): if n < 1: return 0 elif n == 1: return 1 return fibs(n - 2) + fibs(n - 1) print(fibs(6)) 2.循环 # 循环 def fibs(n): a = [1, 1] for i in range(n - 2): a.append(a[-2] + a[-1]) return a[n-1] print(fibs(6)) class Solution: def fib(self

斐波那契的两种实现方法

#include <stdio.h> int fib(int n) { int a = 1; int b = 1; int c = a = b; int i = 0; for (i = 3; i <= n; i++) { c = a + b; a = b; b = c; } return c; } int main() { printf("%d\n", fib(10000)); getchar(); return 0; } 非递归方法 #include <std

斐波拉契序列几种实现

今天遇到一个面试题:输入n,如果n<=1,f(n)=1,其他f(n)=f(n-1)+f(n-2), 打印f(n)从1到n的值. public class Fibonacci { private int n; private StringBuilder sb; private String format; @Before public void init() { n = 10; sb = new StringBuilder(n); format = "f(%s) = "; } 直接

斐波那契高效算法(4种算法综合分析)

斐波那契数列问题是算法学习者必定接触到的问题.作为经典问题,首次接触时通常是作为递归算法的案例教程. 然而递归解决斐波那契.其效率低的令人发指,有人算出其时间复杂度为O(2^n).指数级时间复杂度. 假设面试的时候面试官问你斐波那契的求解方法,你来一个递归求解,基本上能够说,你已经game over了. 那么有没有更高效的算法呢.本文将一一介绍. 以下是斐波那契的4种解法: 1.递归    时间复杂度O(2^n) int f(int n){ if(n == 1 || n == 2){ retur