找回密码
 欢迎注册
查看: 24353|回复: 11

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

[复制链接]
发表于 2008-12-8 11:05:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

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

不要说一一计算,再对比:)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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 | 显示全部楼层
通项公式
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-12-8 11:31:47 | 显示全部楼层
解这个方程的最简单,但不是最好的方法。是2分法。因为这个序列是单调递增的,使用类似2分查找的算法,复杂度是log2(n)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-12-8 11:35:03 | 显示全部楼层

结果可能不唯一

比如 Fib(1) = Fib(2) = 1,
以及有 $Fib(-n)=(-1)^(n+1) * Fib(n) \quad (n in ZZ )$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-12-8 11:38:30 | 显示全部楼层
忘了说了,2楼的公式中,n是大于等于1的整数。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-12-8 11:38:56 | 显示全部楼层
设fibonacci序列中某项的值为x,那么,
1):若x==1,则序号是1或者2。
2):否则,它的序号是:log(x*5/sqrt(5))/log((sqrt(5)+1)/2)的四舍五入的整数。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-12-8 13:01:02 | 显示全部楼层
to liangbch:二分法,你现在没有数列的表,怎么查找?计算出来一一查找的话,时间复杂度不小啊
to medie2005:log(x*5/sqrt(5))/log((sqrt(5)+1)/2)你这个公式是怎么算出来的?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-12-8 13:19:29 | 显示全部楼层
medie2005的方法就是利用通项公式计算的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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附近查找就可以了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-13 12:19 , Processed in 0.242117 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表