2011-12-24 31 views
4

我解决a Project Euler problem是去如下的“而”循环中产生的某些值:我如何可以添加使用Python

通过考虑其值不超过4万元斐波纳契数列的条款,发现即使值项之和”

所以我用这个脚本打印Fibonacci序列多达四​​百万:

a = 0 
b = 1 
while b < 4000000: 
    print b 
    a, b = b, a+b 

显然,我可以运行这个,只需手动添加偶数值,但我会觉得我在作弊。

从技术上讲,我想我问两个问题:

  1. 我怎么能挑出来的唇上?
  2. 我怎样才能添加这些均匀而不实际分配给他们的变量?

噢,我相信它是非常明显的,但我很新......呃,编程一般而言,我可以很容易地迷失在专家的冗长之中。提前致谢!

回答

1

我怎么能挑出来的唇上?

偶数是当您将它们除以2(整数)时剩下的零。在Python中,我们用%运算符得到“除以整数后的余数”。

但是,这里还有另一个巧妙的技巧。即使斐波纳契数字是序列中的第三个数字,如果您可以严格证明原因,那么您将接近获得直接生成甚至斐波那契数列序列所需的公式。

我怎么能添加这些均匀而没有实际分配给他们的变量?

将它们分配给变量有什么问题?只需设置另一个运行计数。

+0

我没有弄清楚你所说的诡计,但你的答案很简单。这让我找到了一条替代路线。我只是添加了一个简短的'if'语句来添加偶数值。谢谢! – Grant 2011-12-24 22:45:11

+0

我其实不太确定我对这个技巧的断言。 > _ < – 2011-12-24 23:07:51

2

啊,项目欧拉!

虽然这是一个比编程问题更多的数学问题。

在编程方面,只需添加一个累加器即可。您可以使用模运算符%来测试均匀性,该运算符在将左操作数除以右操作数后返回整数余数。

a, b = 0, 1 
evens = 0 
while b < 4000000: 
    if not b%2: 
     evens += b 
    a, b = b, a+b 

一旦你找到了答案,该项目欧拉PDF和论坛将填补你在这个问题上的mathy一部分,真正回答你的问题。有几种方法可以避免计算每个斐波纳契数,并且必须测试均匀性,但这些都需要利用斐波那契数列的特定数学属性。

6

如果你不愿意变量赋值,你可以享受一个functional approach

>>> from itertools import takewhile, ifilter 

>>> def fib(): 
     a, b = 0, 1 
     while True: 
      yield a 
      a, b = b, a+b 

>>> def is_even(x): 
     return x % 2 == 0 

>>> sum(ifilter(is_even, (takewhile(lambda x: x<4000000, fib())))) 
4613732 
+0

使用'return not(x%2)'而不是'return x%2 == 0':它更pythonic更快。 – gecco 2011-12-24 09:17:00

+2

@gecco'return not(x%2)'利用了0被视为'False'并使得条件隐含的事实。我不明白这怎么可能被认为是更pythonic。我怀疑它会对CPython以外的其他实现产生影响。 – DasIch 2011-12-24 20:07:04

相关问题