求Fibonacci数列的第n项

题目:

定义Fibonacci数列如下:

方法一:

递归的方法,代码如下:

#include<iostream>

using namespace std;

int Fibona(int n)

{

int m;

if (n == 0)

return 0;

else if (n == 1 || n == 2)

return 1;

else

{

m = Fibona(n - 1) + Fibona(n - 2);

return m;

}

}

int main()

{

cout << "-------" << endl;

cout << Fibona(17) << endl;

return 0;

}

方法二:

从下往上计算,首先根据f(0)和f(1)计算f(2),再根据f(1)和f(2)求出f(3).......

依此类推就可以算出第n项了,时间复杂度为O(n),实际上就是用递推。

long long Fibonacci_Solution2(unsigned n)

{

int result[2] = { 0, 1 };

if (n < 2)

return result[n];

long long fibMinusOne = 1;

long long fibNMinusTwo = 0;

long long fibN = 0;

for (unsigned int i = 2; i <= n; ++i)

{

fibN = fibMinusOne + fibNMinusTwo;

fibNMinusTwo = fibMinusOne;

fibMinusOne = fibN;

}

return fibN;

}

解法三:

下面介绍一种时间复杂度是O(logn)的方法。在介绍这种方法之前,先介绍一个数学公式:

{f(n), f(n-1), f(n-1), f(n-2)} ={1, 1, 1,0}n-1

(注:{f(n+1), f(n), f(n), f(n-1)}表示一个矩阵。在矩阵中第一行第一列是f(n+1),第一行第二列是f(n),第二行第一列是f(n),第二行第二列是f(n-1)。)

有了这个公式,要求得f(n),我们只需要求得矩阵{1, 1, 1,0}的n-1次方,因为矩阵{1, 1, 1,0}的n-1次方的结果的第一行第一列就是f(n)。这个数学公式用数学归纳法不难证明。感兴趣的朋友不妨自己证明一下。

现在的问题转换为求矩阵{1, 1, 1, 0}的乘方。如果简单第从0开始循环,n次方将需要n次运算,并不比前面的方法要快。但我们可以考虑乘方的如下性质:

/  an/2*an/2                      n为偶数时

an=

\  a(n-1)/2*a(n-1)/2            n为奇数时

要求得n次方,我们先求得n/2次方,再把n/2的结果平方一下。如果把求n次方的问题看成一个大问题,把求n/2看成一个较小的问题。这种把大问题分解成一个或多个小问题的思路我们称之为分治法。这样求n次方就只需要logn次运算了。

实现这种方式时,首先需要定义一个2×2的矩阵,并且定义好矩阵的乘法以及乘方运算。当这些运算定义好了之后,剩下的事情就变得非常简单。完整的实现代码如下所示。

let A={1, 1, 1,0};

int f(int n)

{

int A[4] = { 1, 1, 1, 0 };

int result[4];

power(A, n, result);

return result[0];

}

void multiply(int A[], int B[], int _r[])

{

_r[0] = A[0] * B[0] + A[1] * B[2];

_r[1] = A[0] * B[1] + A[1] * B[3];

_r[2] = A[2] * B[0] + A[3] * B[2];

_r[3] = A[2] * B[1] + A[3] * B[3];

}

void power(int A[], int n, int _r[])

{

if (n == 1){ memcpy(A, _r, 4 * sizeof(int)); return; }

int tmp[4];

power(A, n >> 1, _r);

multiply(_r, _r, tmp);

if (n & 1 == 1)

multiply(tmp, A, _r);

else

memcpy(_r, tmp, 4 * sizeof(int));

}

时间: 2025-01-04 23:52:46

求Fibonacci数列的第n项的相关文章

用Python实现求Fibonacci数列的第n项

1. 背景——Fabonacci数列的介绍(摘自百度百科): 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci )以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……用公式定义如下: 计算通式为: 当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618 2. 用Python迭代实现求解Fibonacci数列的第n项 def fi

【编程题目】题目:定义 Fibonacci 数列 输入 n,用最快的方法求该数列的第 n 项。

第 19 题(数组.递归):题目:定义 Fibonacci 数列如下:/ 0 n=0f(n)= 1 n=1/ f(n-1)+f(n-2) n=2输入 n,用最快的方法求该数列的第 n 项. 思路:递归和非递归的 下面的代码有个问题,没有考虑大数越界.返回值应该设成long long型的 递归速度非常慢 /* 第 19 题(数组.递归): 题目:定义 Fibonacci 数列如下: / 0 n=0 f(n)= 1 n=1 / f(n-1)+f(n-2) n=2 输入 n,用最快的方法求该数列的第

c语言:用数组来处理求Fibonacci数列问题

用数组来处理求Fibonacci数列问题. 解:程序: #include<stdio.h> int main() { int i, f[20] = { 1,1 };//对最前面两个元素f[0]和f[1]赋初值1 for (i = 2; i < 20; i++) { f[i] = f[i-2]+f[i-1];//先后求出f[2]~f[19]的值 } for (i = 0; i<20; i++) { if (i % 5 == 0)//控制每输出5个数后换行 { printf("

C++项目参考解答:求Fibonacci数列

[项目:求Fibonacci数列] Fibonacci数列在计算科学.经济学等领域中广泛使用,其特点是:第一.二个数是1,从第3个数开始,每个数是其前两个数之和.据此,这个数列为:1 1 2 3 5 8 13 21 34 55 89 --,请设计程序,输出这个数列,直到这个数字超过10000. [提示]数列可以表示为: {f1=f2=1fn=fn?1+fn?2,n>2 [参考解答] #include <iostream> using namespace std; int main( )

16.O(logn)求Fibonacci数列

http://zhedahht.blog.163.com/blog/static/25411174200722991933440/ http://blog.csdn.net/foolishwolf_x/article/details/8774874 log(n)时间求a^n. 代码如下: #include "stdafx.h" #include <iostream> using namespace std; /* f(0) = 0. f(1) = 1. f(N) = f(N

迭代法求fibonacci数列--简单

// 迭代法求fibonacci数列 public class p52 { public static void main(String[] args) { int f1=1,f2=1; for(int i=1;i<=18;i++) { System.out.print(f1+"\t"+f2+"\t"); if(i%3==0) System.out.println(); f1=f1+f2;    //迭代法求fibonacci数列 f2=f2+f1; } }

poj 3070 Fibonacci(矩阵快速幂求Fibonacci数列)

题目链接: http://poj.org/problem?id=3070 题意: 我们知道斐波那契数列0 1 1 2 3 5 8 13-- 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. 思路: 这里的n很大,有10^9,for一遍肯定是不可以的. 所以要用矩阵乘法求斐波那契数列. f[n+1] = f[n]+f[n-1] f[n] = f[n] 构造以下矩阵,n次幂,mat[1][0] 就是答案 1 1 1 0 求矩

用数组求Fibonacci数列

#include<stdio.h>int main(){      int a[20]={1,1};      int n=2,i;      for(n=2;n<20;n++)         {             a[n]=a[n-1]+a[n-2];         }       for(i=0;i<20;i++)         {             if(i%5==0)             printf("\n");         

求fibonacci数列 java

java 和 c 差不多.但是java可以根据需求定义数组. 我还不会java的函数调用,所以用数组的方法. 1 import java.util.Scanner; 2 public class fibon{ 3 public static void main(String[] args){ 4 Scanner input=new Scanner (System.in); 5 int i,n; 6 n=input.nextInt(); 7 int[] arr=new int[n]; 8 arr[