用递归的方式求斐波那契数列的第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;
}
转载于:https://blog.51cto.com/10739786/1742280