【问题标题】:How can I add certain values that were produced in a 'while' loop using Python如何使用 Python 添加在“while”循环中生成的某些值
【发布时间】:2012-01-27 05:12:22
【问题描述】:

我正在解决a Project Euler problem,如下所示:

通过考虑斐波那契数列中值不超过四百万的项,求偶数项之和。”

所以我用这个脚本打印了多达四百万的斐波那契数列:

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

显然,我可以运行它并手动添加偶数值,但我会觉得我在作弊。

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

  1. 我怎样才能挑选出偶数?
  2. 如何在不将它们实际分配给变量的情况下添加这些偶数?

哦,我确信它非常明显,但我对……嗯,一般来说编程很陌生,我很容易迷失在专家的冗长中。提前致谢!

【问题讨论】:

    标签: python while-loop fibonacci


    【解决方案1】:

    如果您不喜欢变量赋值,您可能会喜欢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
    

    【讨论】:

    • 使用return not (x % 2)而不是return x %2 == 0:它更pythonic更快。
    • @gecco return not (x % 2) 利用了 0 被视为 False 的事实,并使条件隐含。我不明白这怎么可能被认为更像是pythonic。我怀疑它是否会对 CPython 以外的其他实现产生影响。
    【解决方案2】:

    啊,欧拉计划!

    不过,这更像是一道数学题而不是编程题。

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

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

    一旦您得到答案,Project Euler PDF 和论坛将向您介绍这个问题的数学部分,并真正回答您的问题。有一些方法可以避免计算每个斐波那契数并测试均匀度,但这些方法需要利用斐波那契数列的特定数学属性。

    【讨论】:

      【解决方案3】:

      我怎样才能挑选出偶数?

      偶数是除以 2(整数)时余数为零的数。在 Python 中,我们使用 % 运算符得到“除以整数后的余数”。

      不过,您还可以在此处使用另一个巧妙的技巧。偶数斐波那契数列在序列中的每三个数字中,如果您能严格证明原因,那么您将接近获得直接生成偶数斐波那契数列所需的公式。

      如何在不将它们实际分配给变量的情况下添加这些偶数?

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

      【讨论】:

      • 我没有弄清楚你所说的技巧,但你的回答很简单。这让我找到了另一条路线。我刚刚添加了一个简短的“if”语句来添加偶数值。谢谢!
      • 我实际上不再那么确定我对这个技巧的断言了。 >_
      猜你喜欢
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 2011-07-08
      • 2017-09-26
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多