Problem 2

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Find the sum of all the even-valued terms in the sequence which do not exceed four million.

 

Fibonacci序列中的每一个新元素都是前两个元素之和。由12开始,前十个元素为:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

找到这个序列中所有不超过4百万的偶数元素之和。

 

最简单的方法:

对一个Fibonacci序列循环,判断当前值是否是偶数,如果是偶数,加入到总和里,一直加到当前元素值大于4百万。

  1. def fibsum1(n):
  2.     sum = 0
  3.     a, b = 12
  4.     while b < n:
  5.         if (b%2 == 0):
  6.             sum += b
  7.         a, b = b, a+b
  8.     return sum
 

还有稍微复杂点的方法:

可以观察到,在该序列中每隔2个数为偶数,所以只要循环的时候加两次就可以了,这样能够避免取余的操作了。

  1. def fibsum2(n):
  2.     sum = 0
  3.     a = 1
  4.     b = 1
  5.     c = a + b
  6.     while c < n:
  7.         sum = sum + c
  8.         a = b + c
  9.         b = c + a
  10.         c = a + b
  11.     return sum
 

在这个问题的相应回帖中,贴出了一个python的解答。

每隔两个奇数有一个偶数,则可以看出Fibonacci序列为:

x, y, x + y, x + 2y, 2x + 3y, 3x + 5y

前两个奇数为x,y时,后两个奇数为x+2y, 2x+3y 每个偶数为前两个奇数的和。所以程序可为:

  1. def fibsum3(n):
  2.     x = y = 1
  3.     sum = 0
  4.     while (y < n):
  5.         sum += (x + y)
  6.         x, y = x + 2 * y, 2 * x + 3 * y
  7.      return sum
 

进行一下测试,

  1. if __name__ == '__main__':
  2.     print fibsum1(4000000)
  3.     print fibsum2(4000000)
  4.     print fibsum3(4000000)

结果是:4613732

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值