用递归的方式求斐波那契数列的第n个数。

用非递归的方式求斐波那契数列的第n个数。

定义:

     斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368


    特别指出:第0项是0,第1项是第一个1。

    这个数列从第2项开始,每一项都等于前两项之和。



#include<stdio.h>
#include<stdlib.h>
#include<cmath>


int FibonacciRecursion(int a, int b, const int n)
{
 //存在n对应的一项可能超出 %d 所表示的整数范围
 int count = n;
 if (0 == count)
  return a;
 else
 {
  if (a + b > 0)
   return FibonacciRecursion(b, a + b, --count);//传入的a+b必须大于0
  else
   return -1;
 }
}

int FibonacciNonrecursionFormula(int const n)//非递归公式法(double与int转换时有误差)
{
 int count =(int) 1.0 / sqrt(5)*(pow((1.0 + sqrt(5)) / 2.0, n) - pow((1.0 - sqrt(5)) / 2, n));
 return count < 0 ? -1 : count;
}

int FibonacciNonrecursion(int const n)//非递归非公式法
{
 int count = n;
 int a = 0;
 int b = 1;
 int tmp = a;
 if (0 == n)
  return a;
 if (1 == n)
  return b;
 else
 {
  while (count--)
  {
   tmp = a;
   a = b;
   b = a + tmp;
   if (a < 0)
    return -1;
  }
  return a;
 }
}
int main()
{
 int n = 0;
 while (n++<88)
 {
  if (FibonacciRecursion(0, 1, n) != FibonacciNonrecursionFormula(n) || FibonacciNonrecursion(n) != FibonacciNonrecursionFormula(n))
  {
   printf("Fibonacci 数列第 %d 项为:%d - %d\n", n, FibonacciRecursion(0, 1, n), FibonacciNonrecursionFormula(n));
   printf("              第 %d 项为:%d\n", n, FibonacciNonrecursion(n));
  }
 }

 printf("%d\n", 2836311903);//45项+46项 < 2836311903  所以在46以后大于0x7fffffff
 system("pause");
 return 0;
}

wKioL1bBqOzjbvvoAAMN9jEw3HU350.jpg

wKioL1bBqO7y6BPlAAJ5k-rlg_g616.jpg