使用Generators实现Fibonacci序列返回2**a错误结果如何解决
问题描述
使用生成器(Generators)实现斐波那契序列时,代码运行返回类似2**a形式的错误值,无法得到符合预期的斐波那契数列,原实现代码如下:
def fibonacci(): a, b = 0, 1 while True: yield a a = b b = a + b n = int(input("How long? ")) fib = fibonacci() for i in range(n): print(next(fib))
错误原因
变量更新顺序存在逻辑问题:
- 代码先执行
a = b,此时变量a存储的旧值已经被覆盖为上一轮的b值 - 后续执行
b = a + b时,参与求和的a是更新后的值,计算逻辑等价于b = b + b = 2*b,每轮数值都会翻倍,最终输出的是2的幂次序列,不符合斐波那契数列的递推规则。
修复方法
斐波那契递推计算新值时需要同时用到上一轮的两个变量值,使用Python的并行赋值语法可以在不引入临时变量的前提下,一次性完成两个变量的同步更新,避免中间值覆盖导致的计算错误。
修正后的完整代码:
def fibonacci(): a, b = 0, 1 while True: yield a # 等号右侧先基于旧值完成所有计算,再同步赋值给左侧变量 a, b = b, a + b n = int(input("How long? ")) fib = fibonacci() for i in range(n): print(next(fib))
以输入长度10为例,运行后输出为0、1、1、2、3、5、8、13、21、34,符合斐波那契数列的预期结果。
内容的提问来源于stack exchange,提问作者Moises Pineda
相关产品推荐
相关产品推荐

