【问题标题】:Using python to find even Fibonacci numbers使用python查找偶数斐波那契数
【发布时间】:2020-01-30 19:27:51
【问题描述】:

斐波那契数列中的每个新项都是通过添加前两项来生成的。从 1 和 2 开始,前 10 个术语将是:

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

通过考虑斐波那契数列中值不超过四百万的项,求偶数项之和。 我就是这样做的,但是我得到了错误的值,我不知道为什么。

Sum=0
n=0
a=1
b=2
while a<=4e6 and b<=4e6:
    if a%2==0:
        Sum = Sum + a
    n=a+b
    a=b
    b=n
if b%2==0:
    sum=sum+b
print(Sum)

我的值是 1089154,这是不正确的。

【问题讨论】:

  • if b %2 == 0: 缩进不正确,这使得它在while 循环之外。你的代码也是这样吗?
  • 根据我在下面的回答,我发现您的问题是您的 while 声明应该是:while a&lt;=4e6:
  • 即当b 大于 4m 但a 不是时,您希望它添加aSum
  • @EJoshuaS-ReinstateMonica 如果将其放在循环中,则将偶数加到总和中两次。不好。看起来像是试图获得一个潜在的最后一个偶数,因此它属于循环之外。
  • @HeapOverflow 只是确保这是 OP 的意图。不确定他们是否期望它成为循环的一部分。

标签: python


【解决方案1】:

请注意,斐波那契数以 0 和 1 开头,而不是 1 和 2。这不会影响您的结果,但它确实使处理这些数字更容易。

首先编写一个生成器函数,该函数生成所有斐波那契数(最终)。

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

如果一个值是偶数,则不必测试它,因为偶数在序列中的出现非常可预测:

<b>0</b> 1 1 <b>2</b> 3 5 <b>8</b> 13 21 <b>34</b> ...

从第一个值开始,每隔三个值是偶数。

给定生成器

f = fib()  # All the Fibonacci numbers

然后您可以通过三个简单的步骤获得答案:

from itertools import islice, takewhile

evens = islice(f, 0, None, 3)  # All the even Fibonacci numbers
small = takewhile(lambda x: x <= 4000000, evens)  # Just the ones under 4,000,000
result = sum(small)

您不需要每三分之一值的技巧,但它比

更有效一点
evens = filter(lambda x: x % 2 == 0, f)

【讨论】:

    【解决方案2】:

    只需对代码进行最少的更改:

    Sum=0
    n=0
    a=1
    b=2
    # while a<=4e6 and b<=4e6:
    while a<=4e6:
        if a%2==0:
            Sum = Sum + a
        n=a+b
        a=b
        b=n
    # if b%2==0:
    #     sum=sum+b  
    print(Sum)
    

    基本上您不需要查看b,因为b下一个 术语。如果您在b 超过4e6 时停止循环,则会跳过小于4e6a 的值。循环之后的 if 语句试图弥补这一点,但它应该查看 a(如果你保持 while 语句相同)并且它添加到 sum 而不是 Sum。你不需要第二个 if 语句,因为 while 语句是固定的。

    我会这样做:

    def fib(max=-1):
        curr, next = 0, 1
        while curr <= max:
            yield curr
            curr, next = next, curr + next
    
    print(sum(n for n in fib(4e6) if n % 2 == 0))
    

    【讨论】:

      【解决方案3】:

      我会通过编写一个函数来使斐波那契序列元素达到目标数字,这样您就可以更轻松地进行调试。

      fibonacci 函数返回斐波那契数列中小于或等于n 的所有元素的列表:

      def fibonacci(n):
          seq = [0, 1]
          while seq[-1] < n:
              seq.append(seq[-2] + seq[-1])
          return seq[:-1]
      

      然后你可以做一个简单的列表推导来总结所有偶数项:

      sum([i for i in fibonacci(4e6) if i%2 ==0])
      

      【讨论】:

      • 我得到的结果是 4613732,正好比你的结果多 3524578。所以你的代码的问题似乎是它没有将满足低于 4m 标准的最终元素添加到总和中。
      【解决方案4】:
      s = 0
      a, b = 0, 1
      while b < 4e6:
          if b % 2:
              s += b
          a, b = b, a + b
      
      print(s)
      

      【讨论】:

        猜你喜欢
        • 2015-07-25
        • 1970-01-01
        • 2021-12-21
        • 2011-02-04
        • 2014-05-23
        • 2016-04-07
        • 2020-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多