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-1) + f(N-2)_ (N>=2)

see http://blog.linjian.org/articles/fibonacci-essay/ for more detail
*/

// recursive
unsigned int rfib(unsigned int n)
{// o(2^n)
if (n<2)
{
return n;
}
else
{
return rfib(n-1)+rfib(n-2);
}
}

// use table to reuse value : forward
#define MAX 1000
unsigned int f[MAX]={0};
unsigned int tfib_forward(unsigned int n)
{// o(n)
f[0] = 0;
f[1] = 1;
for (unsigned int i=2;i<=n;++i)
{
f[i] = f[i-1] + f[i-2];
}
return f[n];
}

// use table to reuse value : backward
unsigned int tfib_backward(unsigned int n)
{
if (n<2)
{
f[n] = n;
return f[n];
}
else
{
if(f[n]==0)
f[n] = tfib_backward(n-1) + tfib_backward(n-2);
return f[n];
}
}

// use temp value instead of table
unsigned int fib(unsigned int n)
{// o(n)
if (n<2)
{
return n;
}
else
{
unsigned int a=0,b=1,c;
for (unsigned int i=2;i<=n;++i)
{
c = a + b;
a = b;
b = c;
}
return c;
}
}

// use template meta programming #1 struct-enum
// enum has value range
#define FIBE(N) FibE<N>::Val

template<int N>
struct FibE
{
enum
{
Val = FibE<N-1>::Val + FibE<N-2>::Val
};
};

template<>
struct FibE<0>
{
enum
{
Val = 0
};
};

template<>
struct FibE<1>
{
enum
{
Val = 1
};
};

// use template meta programming # class-static const
#define FIBC(N) FibC<N>::val

template<int N>
class FibC
{
public:
static const unsigned int val = FibC<N-1>::val + FibC<N-2>::val;
};

template<>
class FibC<0>
{
public:
static const unsigned int val = 0;
};

template<>
class FibC<1>
{
public:
static const unsigned int val = 1;
};

// use calss-function
class Fib
{
public:
Fib() : a(0), b(1), n(0)
{
}
unsigned int operator()()
{
if (n <= 1) {
n++;
return n - 1;
} else {
int c;
c = a + b;
a = b;
b = c;
return c;
}
}
private:
int a, b, n;
};

// test
void test_tfib_forward()
{
for (int i=0;i<MAX;++i)
{
cout<< tfib_forward(i)<<" ";
}
}

void test_metaFibE()
{
cout<<FIBE(50)<<endl;
}

void test_metaFibC()
{
cout<<FIBC(50)<<endl;
}

void test_cfib()
{
int i=10;
Fib fib;
do {
cout << fib() << endl;
} while (i--);
}

int main()
{
//test_tfib_forward();
test_metaFibE();
test_metaFibC();
test_cfib();

system("pause");
return 0;
}

16.O(logn)求Fibonacci数列

时间: 2024-10-13 22:24:52

16.O(logn)求Fibonacci数列的相关文章

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( )

迭代法求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; } }

求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 << &q

用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

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数列 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[

用数组求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");         

c编程:求Fibonacci数列的两种方式。

一种是输入一个整数n,则程序输出在n位置上的Fibonacii数字: #include<stdio.h> int Fibo(int n) { if(n==1||n==2) return 1; return Fibo(n-1)+Fibo(n-2); } int main() { int n; scanf("%d",&n); printf("%d\n",Fibo(n)); return 0; } 一种是保存在数组中以便输出: #include<