初夏小谈:斐波那契三种实现方法(C语言版)(第三种相信你没见过)
斐波那契数列(Fibonaccisequnce),又称黄金分割数列。研究斐波那契数列有相当重要的价值,例在现代物理、准晶体结构、化学等领域都有直接的应用。因此研究斐波那契数列也是很有必要的。
今天初夏将为大家带来计算斐波那契数列第n位的三种方法
第一种利用递归的方法计算,代码相当简单,但其重复计算率太高,导致其时间复杂度比指数还要爆炸式增长。不推荐此方法。但递归的思想却相当的重要还是要理解并掌握。
#include<Aventador_SQ.h>
int Fibonacci(int n)
{
if (1 == n|| 2 == n)
{
return 1;
}
else
{
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
int main()
{
int n = 0;//求取第n个数
int a = 0;//所求的数
scanf("%d", &n);
a=Fibonacci(n);
printf("第%d个数是%d\n",n,a);
system("pause");
return 0;
}
第二种是利用循环的方法,借助三个变量进行交换。其时间复杂度是O(n)
#include<Aventador_SQ.h>
void Fibonacci(int x)
{
if (x < 1)
{
printf("输入错误!!!\n");
}
else if (x < 3)
{
printf("第%d个数是1\n", x );
}
else
{
int FiboOne = 1;
int FiboTwo = 1;
int FiboN = 0;
int i=0;
for (i = 3; i <= x; i++)
{
FiboN = FiboOne + FiboTwo;
FiboOne = FiboTwo;
FiboTwo = FiboN;
//printf("%d\t%d\n", i, FiboN);
}
printf("第%d个数是%d\n", x, FiboN);
}
}
int main()
{
int n;
scanf("%d", &n);
Fibonacci(n);
system("pause");
return 0;
}
第三种到了最伤脑子的算法即矩阵,但运行速度大大提高。
#include<Aventador_SQ.h>
void Fibonacci(int x)
{
int FFiboZero = 0, FiboZero = 0;
int FFiboOne = 1, FiboOne = 1;
int FFiboTwo = 1, FiboTwo = 1;
int FiboN = 0;
int i = 0;
for (i = 2; i <= (x / 2); i++)
{
FiboN = FFiboTwo * FiboTwo + FFiboOne * FiboOne;//利用矩阵求出待求得数字
//进行交换达到移动中间变量
FFiboZero = FFiboOne;
FFiboOne = FFiboTwo;
FFiboTwo = FiboN;
}
FiboN = FFiboTwo * FFiboTwo + FFiboOne * FFiboOne;//得到最终的所求取得数
printf("%d\t%d\n", x, FiboN);
}
void JFibonacci(int x)
{
int FFiboZero = 0, FiboZero = 0;
int FFiboOne = 1, FiboOne = 1;
int FFiboTwo = 1, FiboTwo = 1;
int FiboN = 0;
int i = 0;
for (i = 2; i <= ((x - 1) / 2); i++)
{
FiboN = FFiboTwo * FiboTwo + FFiboOne * FiboOne;
FFiboZero = FFiboOne;
FFiboOne = FFiboTwo;
FFiboTwo = FiboN;
}
//当所求的位数是奇数时要另外计算第三种情况
FiboN = FFiboTwo * FFiboTwo + FFiboOne * FFiboOne;
FFiboTwo = FFiboTwo * FFiboOne + FFiboOne * FFiboZero;
FiboN = FiboN * FiboTwo + FFiboTwo * FiboOne;
printf("%d\t%d\n", x, FiboN);
}
int main()
{
int n = 0;
printf("n位数:");
scanf("%d", &n);
if (n % 2 == 0)
{
JFibonacci(n);//n可以被2整除
}
else
{
Fibonacci(n);//n不能被2整除
}
system("pause");
return 0;
}
与君共享,如果有更好的建议或意见欢迎留言。
QQ2630420233
珍&源码