【问题标题】:Automatically created list from printed objects从打印对象自动创建列表
【发布时间】:2018-08-25 22:06:37
【问题描述】:

我是 Python 新手,正在通过 edX 学习并尝试解决 ProjectEuler 数学问题。第二个问题是关于将所有小于 4,000,000 的偶数斐波那契数相加。我能够用 Python 解决这个问题,但不是以一种令我满意的方式。

首先我定义了一个fib函数:

def fib(n):
if n == 0:
    return 0
elif n == 1:
    return 1
else:
    return fib(n-1) + fib(n-2)

然后,我能够打印所有小于 4,000,000 的偶数斐波那契数:

n = 0
while True:
if fib(n) < 40000000 and fib(n) % 2 == 0:
    print(fib(n))
    n = n+1
elif fib(n) < 4000000 and fib(n) % 2 != 0:
    n = n+1
else:
    break

然后,我根据打印的内容手动形成了一个列表,并将列表相加。问题是我不想这样做。我希望计算机在运行时形成列表,然后总结价值。有谁知道我该怎么做?谢谢!

【问题讨论】:

    标签: list printing sum


    【解决方案1】:

    您可以编写一个生成 fib 数字的生成器,然后在数字小于 400 万时从中获取 (4e6):

    import itertools
    
    def fib(n):
      if n == 0: return 0
      elif n == 1: return 1
      else: return fib(n-1) + fib(n-2)
    
    # A generator function that lazily produces new fib numbers
    def gen_fibs():
      n = 1
      while True:
        yield fib(n) 
        n += 1
    
    # Take from the generator while n is less than 4 million
    fibs = itertools.takewhile(lambda n: n <= 4e6, gen_fibs())
    
    # Keep all the evens
    even_fibs = (n for n in fibs if n % 2 == 0)
    
    # Then print the sum of even fibs
    print(sum(even_fibs)) 
    

    可能有一种方法可以绕过手动定义生成器,但这仍然相当简洁。如果range 有一个生成无限列表的 0-arity 版本,我可以将第一部分简化为生成器表达式,但这就是生活。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 2012-04-30
      • 1970-01-01
      • 2011-09-07
      • 2017-06-26
      • 2022-01-09
      相关资源
      最近更新 更多