g99 发表于 2008-12-8 11:05:12

给定fibonacci数列的一项,如何求得它在数列中的项数

1,1,2,3,5,8,13,21,34,55,。。。
比如我给出21,那么他在数列中的项数为8

不要说一一计算,再对比:)

liangbch 发表于 2008-12-8 11:26:44

fibonacci 数列是有通项公式的,见下,解出这个方程即可
a_n= sqrt(5)/5( (1+sqrt(5))/2)^n- sqrt(5)/5( (1-sqrt(5))/2)^n

风云剑 发表于 2008-12-8 11:26:49

通项公式

liangbch 发表于 2008-12-8 11:31:47

解这个方程的最简单,但不是最好的方法。是2分法。因为这个序列是单调递增的,使用类似2分查找的算法,复杂度是log2(n)

gxqcn 发表于 2008-12-8 11:35:03

结果可能不唯一

比如 Fib(1) = Fib(2) = 1,
以及有 $Fib(-n)=(-1)^(n+1) * Fib(n) \quad (n in ZZ )$

liangbch 发表于 2008-12-8 11:38:30

忘了说了,2楼的公式中,n是大于等于1的整数。

medie2005 发表于 2008-12-8 11:38:56

设fibonacci序列中某项的值为x,那么,
1):若x==1,则序号是1或者2。
2):否则,它的序号是:log(x*5/sqrt(5))/log((sqrt(5)+1)/2)的四舍五入的整数。

g99 发表于 2008-12-8 13:01:02

to liangbch:二分法,你现在没有数列的表,怎么查找?计算出来一一查找的话,时间复杂度不小啊
to medie2005:log(x*5/sqrt(5))/log((sqrt(5)+1)/2)你这个公式是怎么算出来的?

mathe 发表于 2008-12-8 13:19:29

medie2005的方法就是利用通项公式计算的

liangbch 发表于 2008-12-8 13:44:52

to liangbch:二分法,你现在没有数列的表,怎么查找?计算出来一一查找的话,时间复杂度不小啊

不需要对所有的项计算的,
如low=1, high=k ,k满足$a_k>x$
          k的值的确立过程,
    计算前8项fibonacci 数列,由于该数列近似于等比数列,其公比是1.618, 因此不难求的$a_k= a_8 * 1.618^(k-8)$

计算中位数 m= (low+hight)/2 , 然后计算 $a_m$,
         如 $x> a_m$ 则 low=m ,否则 high=m, 如此反复,最终在经过log2(K)次迭代可得到结果。

另外,由于fibonacci 数列近似于公比为1.618的等比数列。很容易求的k,使得 a_k近似于x。 然后在k附近查找就可以了。
页: [1] 2
查看完整版本: 给定fibonacci数列的一项,如何求得它在数列中的项数