说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Fibonacci的递归和迭代版本

编辑:说三道四文库 发布时间:2018-05-27 04:06
HTML文档下载 WORD文档下载 PDF文档下载
递归版本
#include <stdio.h>
#include <stdlib.h>

static unsigned long count;

int fib(int x)
{
    int r;
    
    ++count;
    if(x == 1 || x == 2)    return 1;
    return fib(x-2) + fib(x-1); 
}

int main(void)
{
    int i, f;
    
    for(i = 1; i < 20; i++) {
        count = 0;
        f = fib(i);
        printf("fib(%02d) gives %d after %lu iteration%s.\n",
               i, f, count, count == 1 ? "" : "s");
    }
    
    return 0;
}

输出结果:
fib(01) gives 1 after 1 iteration.
fib(02) gives 1 after 1 iteration.
fib(03) gives 2 after 3 iterations.
fib(04) gives 3 after 5 iterations.
fib(05) gives 5 after 9 iterations.
fib(06) gives 8 after 15 iterations.
fib(07) gives 13 after 25 iterations.
fib(08) gives 21 after 41 iterations.
fib(09) gives 34 after 67 iterations.
fib(10) gives 55 after 109 iterations.
fib(11) gives 89 after 177 iterations.
fib(12) gives 144 after 287 iterations.
fib(13) gives 233 after 465 iterations.
fib(14) gives 377 after 753 iterations.
fib(15) gives 610 after 1219 iterations.
fib(16) gives 987 after 1973 iterations.
fib(17) gives 1597 after 3193 iterations.
fib(18) gives 2584 after 5167 iterations.
fib(19) gives 4181 after 8361 iterations.
迭代版本
#include <stdio.h>
#include <stdlib.h>

static unsigned long count;

int fib(int x)
{
    int i, *a, r;
    
    if(x < 3)   return 1;
    a = malloc(x * sizeof(int));
    if(!a)  return -1;
    
    a[1] = a[0] = 1;
    for(i = 2; i < x; i++)  a[i] = a[i-1] + a[i-2];
    r = a[x-1];
    free(a);
    return r; 
}

int main(void)
{
    int i, f;
    
    for(i = 1; i < 20; i++) {
        count = 0;
        f = fib(i);
        printf("fib(%02d) gives %d after %lu iteration%s.\n",
               i, f, count, count == 1 ? "" : "s");
    }
    
    return 0;
}

输出结果:
fib(01) gives 1 after 0 iterations.
fib(02) gives 1 after 0 iterations.
fib(03) gives 2 after 0 iterations.
fib(04) gives 3 after 0 iterations.
fib(05) gives 5 after 0 iterations.
fib(06) gives 8 after 0 iterations.
fib(07) gives 13 after 0 iterations.
fib(08) gives 21 after 0 iterations.
fib(09) gives 34 after 0 iterations.
fib(10) gives 55 after 0 iterations.
fib(11) gives 89 after 0 iterations.
fib(12) gives 144 after 0 iterations.
fib(13) gives 233 after 0 iterations.
fib(14) gives 377 after 0 iterations.
fib(15) gives 610 after 0 iterations.
fib(16) gives 987 after 0 iterations.
fib(17) gives 1597 after 0 iterations.
fib(18) gives 2584 after 0 iterations.
fib(19) gives 4181 after 0 iterations.
经过改进的迭代版本
#include <stdio.h>
#include <stdlib.h>

static unsigned long count;

int fib(int x)
{
    int i, a[3];
    
    if(x < 3)   return 1;
    a[1] = a[0] = 1;
    for(i = 2; i < x; i++) {
        a[2] = a[0] + a[1];
        a[0] = a[1];
        a[1] = a[2];
    }
    
    return a[2];
}

int main(void)
{
    int i, f;
    
    for(i = 1; i < 20; i++) {
        count = 0;
        f = fib(i);
        printf("fib(%02d) gives %d after %lu iteration%s.\n",
               i, f, count, count == 1 ? "" : "s");
    }
    
    return 0;
}

输出结果:
fib(01) gives 1 after 0 iterations.
fib(02) gives 1 after 0 iterations.
fib(03) gives 2 after 0 iterations.
fib(04) gives 3 after 0 iterations.
fib(05) gives 5 after 0 iterations.
fib(06) gives 8 after 0 iterations.
fib(07) gives 13 after 0 iterations.
fib(08) gives 21 after 0 iterations.
fib(09) gives 34 after 0 iterations.
fib(10) gives 55 after 0 iterations.
fib(11) gives 89 after 0 iterations.
fib(12) gives 144 after 0 iterations.
fib(13) gives 233 after 0 iterations.
fib(14) gives 377 after 0 iterations.
fib(15) gives 610 after 0 iterations.
fib(16) gives 987 after 0 iterations.
fib(17) gives 1597 after 0 iterations.
fib(18) gives 2584 after 0 iterations.
fib(19) gives 4181 after 0 iterations.
呵呵,C++中template的递规版本:

#include <iostream>

template <int N>
struct Fibonacci
{
  static const int C = N;
  static const int Value = Fibonacci<N - 1>::Value + Fibonacci<N - 2>::Value;
};

template < >
struct Fibonacci<2>
{
  static const int C = 2;
  static const int Value = 1;
};

template < >
struct Fibonacci<1>
{
  static const int C = 1;
  static const int Value = 1;
};

template <class FibonacciT>
void PrintFibonacci()
{
  std::cout << "Fibonacci(" << FibonacciT::C << ") = " << FibonacciT::Value << std::endl;
}


int main()
{
  PrintFibonacci<Fibonacci<1> >();
  PrintFibonacci<Fibonacci<2> >();
  PrintFibonacci<Fibonacci<3> >();
  PrintFibonacci<Fibonacci<4> >();
  PrintFibonacci<Fibonacci<5> >();
  PrintFibonacci<Fibonacci<6> >();
  PrintFibonacci<Fibonacci<7> >();
  PrintFibonacci<Fibonacci<8> >();
  PrintFibonacci<Fibonacci<9> >();
  PrintFibonacci<Fibonacci<10> >();
  PrintFibonacci<Fibonacci<11> >();
  PrintFibonacci<Fibonacci<12> >();
  PrintFibonacci<Fibonacci<13> >();
  PrintFibonacci<Fibonacci<14> >();
  PrintFibonacci<Fibonacci<15> >();
  PrintFibonacci<Fibonacci<16> >();
  PrintFibonacci<Fibonacci<17> >();
  PrintFibonacci<Fibonacci<18> >();
  PrintFibonacci<Fibonacci<19> >();

  return 0;
}
我也帖两个:)
int
fib (int n)
{
  if (n <= 2)
    return 1;

  static const int aa[16] = {1, 1, 2, 3, 5, 8, 13, 21,
                            34, 55, 89, 144, 233, 377, 610, 987};
  static const int bb[16] = {1, 2, 3, 5, 8, 13, 21, 34,
                            55, 89, 144, 233, 377, 610, 987, 1597};
  int a = 1;
  int b = 1;
  int m = (n - 3) >> 4;
  for (; m > 0; m--)
    {
      int temp = a * 610 + b * 987;
      b = a * 987 + b * 1597;
      a = temp;
    }
  m = (n - 3) & 0xF;
  b = a * aa[m] + b * bb[m];
  return b;
}

int
fib2 (int n)
{
  int a = 1;
  int b = 1;
  for (int i = 3; i <= n; i+=2)
    {
      a += b;
      b += a;
    }
  return (n & 0x1) ? a : b;
}
int
fib2 (int n)
{
int a = 1;
int b = 1;
for (int i = 3; i <= n; i+=2)
{
a += b;
b += a;
}
return (n & 0x1) ? a : b;
}

高!!
N 阶 Fibonacci数列前M个。

#include <iostream>
#include <algorithm>
#include <numeric>

using namespace std;

#define N  2
#define M 10

int main()
{
        int V[N] = { 1 };
        fill(V+1, V+N, 0);
        for (int i = 0; i < M; i++)
                cout << *rotate(V, V+N-1, fill_n(V+N-1, 1, accumulate(V, V+N, 0))) << endl;
}
呵呵,强
有没有用循环队列实现的呢
int Fa(int num)
{
  int i, last1, last2, temp;
  last2 = last1 = 1;
  if((num == 1) || (num == 2))
    return 1;
  for(i = 2; i < num; i++)
{
     temp = last1;
     last1 += last2;
     last2 = temp;
}
return last1;
}
num表示第幾個數。如Fa(1) == Fa(2) == 1;Fa(3) == 2;Fa(4) == 3; Fa(5) == 5.
我已經從1到10都試過了沒問題。
循环队列其实更好,不过stl容器没法循环。其实很多时候stl不是想象的那么漂亮。
顶。
都看了一下。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘