Python声明多变量混淆

标签 python variables fibonacci

我想知道为什么这段代码给我两种不同的解决方案:

a = 0
b = 1
solution = 0

while b <= 4000000:
    if b % 2 == 0:
        solution += b
    a, b = b, a + b

print(solution)

在这种情况下,解决方案 是 4613732。但是,当我尝试此代码时:

a = 0
b = 1
solution = 0

while b <= 4000000:
    if b % 2 == 0:
        solution += b
    a = b
    b = a + b

print(solution)

解决方案是 4194302

有什么建议吗?

最佳答案

差异解释

因为你写:

a = b
b = a + b

在你的第二种方法中。这意味着在第一行之后,a 的值为b。第二行将产生 b = a + b = b + b 所以两次 b。换句话说,第二个实际上会遍历两个的幂。

第一种方法不会发生这种情况,因为您这样写:

a, b = b, a + b

因此,您首先构造一个元组 (b,a+b)(使用 ab 值)。 接下来,您再次将元组解压ab。但是您首先使用旧值计算了 a + b。这是本质的区别。

更有效的方法

您想对偶数 斐波那契数求和。但是,您可以更有效地做到这一点。如果你对斐波那契数列进行分析,你会发现它是结构化的:

o o e o o e o o e ...

o 是一个奇数e 是一个偶数。因此,您可以简单地使用三跳,例如:

a = 1
b = 2
solution = 0

while b <= 4000000:
    solution += b
    a,b = a+2*b,2*a+3*b

print(solution)

因此,我们在这里节省了迭代和检查b是否偶数:我们只知道它总是偶数。

当使用 timeit(在 Linux 上使用 Python 3.5.3 和 GCC 6.3.0)时,我们得到以下结果:

original   3.4839362499988056
optimized  1.5940769709995948  45.755%

因此优化后程序的平均运行时间约为原程序的一半。

关于Python声明多变量混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44570190/

相关文章:

python - Pandas :如何根据其他列值的条件对列求和?

python - 字典中的 "TypeError: ' unicode ' object does not support item assignment"

python - 如何将一串十六进制值转换为整数列表?

php - PHP包含文件中的 undefined variable 错误

algorithm - 手动计算递归斐波那契算法的时间复杂度

python - 错误: TensorFlow: tf. 程序启动时必须调用enable_eager_execution

jquery - 在 jquery 选择器中包含变量

java - 变量未显示在 system.out.println 中

math - 斐波那契数列质数

ruby - Ruby 中的斐波那契数列(递归)