费普纳切数列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了费普纳切数列相关的知识,希望对你有一定的参考价值。
用递归求费普纳切数列前50项 C语言程序
参考技术A 利用特征方程的办法(这个请自行参阅组合数学相关的书)。设斐波那契数列的通项为an。
(事实上an
=
(p^n
-
q^n)/√5,其中p
=
(√5
-
1)/2,
q
=
(√5
+
1)/2。但这里不必解它)
然后记
sn
=
a1
+
a2
+
...
+
an
由于
an
=
sn
-
s(n-1)
=
a(n-1)
+
a(n-2)
=
s(n-1)
-
s(n-2)
+
s(n-2)
-
s(n-3)
=
s(n-1)
-
s(n-3)
其中初值为s1
=
1,
s2
=
2,
s3
=
4。
所以
sn
-
2s(n-1)
+
s(n-3)
=
0
从而其特征方程是
x^3
-
2x^2
+
1
=
0
即
(x
-
1)(x^2
-
x
-
1)
=
0
不难解这个三次方程得
x1
=
1
x2
=
p
x3
=
q
(p,
q值同an中的p,
q)。
所以通解是
sn
=
c1
*
x1^n
+
c2
*
x2^n
+
c3
*
x3^n
其中c1,c2,c3的值由s1,s2,s3的三个初值代入上式确定。 参考技术B 这道题要考虑两点,一是数据溢出,二是运行效率
初步估算((√5+1)/2)^50≈2^34,因此使用long类型会溢出,应该使用vc下的_int64类型.
采用普通递归的方式求Fibonacci数列的时间函数是T(n)=T(n-1)+T(n-2),从而T(n)=T(0)*((√5+1)/2)^n=T(0)*1.618^n
通过实际测试得出T(30)=0.2515 sec,那么T(0)=1.353*10^(-7)
T(50)=1.353*10^(-7)*1.618^50=3802 sec=1.056 hour
也就是说大概要1个小时才能算出所有的项,普通递推之所以慢,是因为其中有很多重复的计算,因此要采用数组保存中间结果,防止重复计算.
下面是我改进后的递归算法:
#include "stdio.h"
#include "windows.h"
#define NUM 60
__int64 fib[NUM];
int flag=-1;//用于标记fib数列中还未计算的项
__int64 Fib(int n)
if(fib[n]!=flag)
return fib[n];
// return Fib(n-1)+Fib(n-2);//普通递归
return fib[n]=Fib(n-1)+Fib(n-2);//改进递归
void main()
int i;
LARGE_INTEGER t1,t2,frq;
for(i=0;i<NUM;i++)
fib[i]=flag;
fib[0]=fib[1]=1;
QueryPerformanceFrequency(&frq);//获取计时器频率
QueryPerformanceCounter(&t1);//获得起始时间
for(i=0;i<NUM;i++)
printf("fib[%d]=%I64d\t",i,Fib(i));
QueryPerformanceCounter(&t2);
printf("time=%f sec\n",(double)(t2.QuadPart-t1.QuadPart)/frq.QuadPart);
尤其要注意递归部分注释掉的和下面的区别,前50项只需0.035秒即全部算出. 参考技术C main()
int i;
for(i=1,i<=50,i++)
printf("%d\n",fbnq(i));
int fbnq(n)
int n,m;
if n==1
m=1;
else if n==2
m=m;
else
m=fbnq(n-1)+fbnq(n-2);
return m
我没有调试软件,可能会有细节错误,请见谅。
裴波拉切数列优化问题
https://blog.csdn.net/qxhly/article/details/105328605
以上是关于费普纳切数列的主要内容,如果未能解决你的问题,请参考以下文章