[关闭]
@Jemy 2013-12-07T04:10:38.000000Z 字数 1474 阅读 1146

计算斐波拉切数列中偶数数列的和

斐波拉切数列的定义为:起始元素为1和2,从第三个元素开始每一个元素为前两个元素的和,比如前10个斐波拉切元素为 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...。现在我们需要你计算区间[1, 4000, 000]之间的所有偶数斐波拉切元素的和。

这个数列看上去很简单,那么我们就按照最普通的方法计算一下。

  1. #coding=utf-8
  2. from datetime import datetime
  3. LIMIT = 4000000
  4. t_start = datetime.now()
  5. elem1 = 1
  6. elem2 = 2
  7. sum = elem2
  8. elem3 = elem1 + elem2
  9. while elem3 <= LIMIT:
  10. if elem3 % 2 == 0:
  11. sum += elem3
  12. elem1 = elem2
  13. elem2 = elem3
  14. elem3 = elem1 + elem2
  15. t_end = datetime.now()
  16. time_delta = t_end - t_start
  17. #计算程序运行时间
  18. last_seconds = time_delta.seconds + (time_delta.microseconds) / 100000.0
  19. print(sum)
  20. print(last_seconds)

可以很快地得到结果不是吗?而且运行速度也很快。i

但是如果我们就这样把这个问题解决了,很明显没有发现斐波拉切数列的有趣之处。

对于这个题目来讲,我们是从1和2开始作为斐波拉切数列的起始元素的并且依次遍历所有的元素并判断奇数偶数的。但是考虑到问题的本身是对斐波拉切数列中所有偶数元素求和,那么我们再仔细观察一下这些元素,看看还有什么规律可以利用的。来认真看一下。

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 ...
仔细看那些偶数元素所在的位置,2位置是2,8位置是5,34位置是8,144位置是11,看出来了么,这些偶数元素的所在位置呈一种等差数列排布啊!这个就等于是从1和2开始,连续获取三次斐波拉切元素就是一个偶数,比如 1+2得到3,2+3得到5,3+5得到8,8 就是一个偶数。那么这样的话,改进一下代码:

  1. #coding=utf-8
  2. from datetime import datetime
  3. def get_next_even_number(e1, e2):
  4. #第一次计算
  5. e3 = e1 + e2
  6. #第二次计算
  7. e1 = e2
  8. e2 = e3
  9. e3 = e1 + e2
  10. #第三次计算
  11. e1 = e2
  12. e2 = e3
  13. e3 = e1 + e2
  14. e1 = e2
  15. e2 = e3
  16. return e3, e1, e2
  17. LIMIT = 4000000
  18. t_start = datetime.now()
  19. elem1 = 1
  20. elem2 = 2
  21. sum = elem2
  22. #起始元素所在位置
  23. pos = 2
  24. e_next_even, elem1, elem2 = get_next_even_number(elem1, elem2)
  25. while e_next_even <= LIMIT:
  26. sum += e_next_even
  27. e_next_even, elem1, elem2 = get_next_even_number(elem1, elem2)
  28. t_end = datetime.now()
  29. time_delta = t_end - t_start
  30. #计算程序运行时间
  31. last_seconds = time_delta.seconds + (time_delta.microseconds) / 100000.0
  32. print(sum)
  33. print(last_seconds)

当然了还有其他的一些方法,大家可以自己探索,欢迎将你的探索结果公布出来,大家一定会赞赏不已。

相关扩展阅读

  1. 维基百科 斐波拉切数列
  2. 网易公开课 斐波那契数列与黄金分割
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注