【问题标题】:finding the sum of even numbers in the Fibonacci series在斐波那契数列中找到偶数的总和
【发布时间】:2014-03-07 03:27:30
【问题描述】:

我遇到了这个问题的解决方案,但不明白其中的几行。 n<=1 and 1 部分在fib(n) 的定义中是什么意思,更大的部分为什么在if not fib(i)%2不是?这怎么不意味着“如果给定的斐波那契数不是偶数,那么我们将它添加到我们的总数中”?

cache = {}

def fib(n):
    cache[n] = cache.get(n, 0) or (n<=1 and 1 
               or fib(n-1)+fib(n-2))
    return cache[n]

i = 0
n = 0 
# we have to pretend the series doesn't go beyond 4 mil
while fib(i) <= (4000000):
    if not fib(i) % 2: 
        n = n + fib(i)
    i = i + 1
print n 

【问题讨论】:

    标签: python numbers fibonacci


    【解决方案1】:

    让我们稍微分解一下:

    (n <= 1) and 1 or (fib(n - 1) + fib(n - 2))
    

    这是 Python 程序员用来模拟条件三元运算符的一种方式,条件三元运算符通常在 C 中可用,但在 Python 中不可用。所以基本上条件表明如果n小于等于1,返回1,或者做fib(n - 1) + fib(n - 2)

    第二个问题:

    这与 python(和其他一些语言)如何将数字转换为布尔条件有关。对于整数,0 的计算结果为 False,其他所有整数的计算结果为 True。在这种情况下,对偶数取模 2 得到 0,奇数得到 1,这意味着它确实检查了一个数是否为奇数,并且它需要一个非奇数,即偶数。

    【讨论】:

    • 哇,所以if not fib(i) % 2 转换为if True。头脑=炸毁。谢谢!
    • 仅当fib(i) 可以被2 整除。
    • 还有一件事,用if not fib(i) % 2代替if fib(i) % 2 == 0有什么好处吗?
    • 归结为编码风格。 Python 程序员在制作布尔表达式时通常遵循此约定,即对于可以转换为 False 的值,避免使用相等表达式。
    【解决方案2】:

    斐波那契数列从 1 开始。在该部分代码检查给定值是否小于或等于 1。

    1 12 3 5 8 13 ...

    如您所见,斐波那契函数是一个偏函数:

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      相关资源
      最近更新 更多