flyinghearts《编程之美》读书笔记连载(3)

作者:flyinghearts

 

2.9 Fibonacci 序列

 

计算 Fibonacci 序列最直接的方法就是利用递推公式 F(n+2)=F(n+1)+F(n) 。而用通项公式来求解是错误的,用浮点数表示无理数本来就有误差,经过n 次方后,当n 相当大时,误差能足够大到影响浮点数转为整数时的精度,得到的结果根本不准。

 

用矩阵来计算,虽然时间复杂度降到O(lgN) ,但要用到矩阵类,相当麻烦。观察:

 

       F(n+2)=F(n)+F(n-1) 2*F(n-1)+F(n-2)=3*F(n-2)+2*F(n-4)

 

用归纳法很容易证明 F(n) = F(k)*F(n+1-k) + F(k-1)*F(n-k) ,利用该递推公式和原递推公式,要计算F(n) ,只要计算F([n/2]) F([n/2]+1) ,时间复杂度为 O(lgN) 。如:要计算F(58) 58 -> 29,30 -> 14,15 -> 7,8 -> 3,4 -> 1,2 可知只要算5 次。可以用一个栈保存要计算的数,实际上,将n 的最高位1 (假设在第k 位)左边的0 去除掉后,第m 次要计算的数就是:第k 位到第k-m+1 位这m 个位组成的值为t(m) ,则第m-1 次组成的值为t(m-1) ,则t(m)=2*t(m-1)+( k-m+1 位是否为1) 。若第m-1次计算得到了 f(k)f(k+1),则:

 

k-m+1 位为1 f(k),f(k+1) -> f(2*k+1),f(2*k+2)

 

k-m+1 位为0 f(k),f(k+1) -> f(2*k),f(2*k+1)

 

具体公式见下面代码。

 

下面是计算F(n) 最后四位数(某道ACM题)的代码。

 

扩展阅读:

《编程之美》豆瓣

《编程之美》互动网

《编程之美》,IT人求职面试必读

 

原贴地址:http://blog.csdn.net/flyinghearts/archive/2010/05/18/5605933.aspx

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值