求斐波那契数列的第n个数(递归非递归)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求斐波那契数列的第n个数(递归非递归)相关的知识,希望对你有一定的参考价值。

用递归的方式求斐波那契数列的第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;
}

技术分享

技术分享


以上是关于求斐波那契数列的第n个数(递归非递归)的主要内容,如果未能解决你的问题,请参考以下文章

求斐波那契数列中的第N个数

用递归函数求斐波那契数列的第n项的值

递归求斐波那契数列

用递归法计算斐波那契数列的第n项

用递归和非递归方法求解斐波那契数列

java用递归编程求斐波那契数列第n项