Python帕斯卡三角形生成器运行结果全为1的问题排查
帕斯卡三角形生成器输出全为1的问题排查
核心错误
问题出在构造结果列表的逻辑:
- 列表推导式
[next(pascal_triangle()) for _ in range(10)]中,每一轮循环都会重新执行pascal_triangle(),相当于每次都创建了一个全新的、从初始状态开始运行的生成器实例 - 对全新的生成器调用
next(),永远只会拿到生成器产出的第一个值,也就是初始count=0时计算的组合数C(0,0)=1,所以最终列表的10个元素全是1 - 额外优化点:计算组合数时建议用整数除法
//替代普通除法/后转int的写法,能避免大数运算时的浮点数精度问题。
修正方案
只需要提前创建好单个生成器实例,再重复调用next()从这同一个生成器里按顺序取值即可,修正后完整代码:
import math def combination(n, r): t = math.factorial(n) // (math.factorial(r) * math.factorial(n - r)) return t def pascal_triangle(): """Return numbers from pascal triangle""" count = 0 while count >= 0: for element in range(count + 1): t = combination(count, element) yield t count += 1 # 初始化单个生成器实例,复用实例取值 gen = pascal_triangle() lst = [next(gen) for _ in range(10)] print(lst)
运行结果
执行后输出为[1, 1, 1, 1, 2, 1, 1, 3, 3, 1],和帕斯卡三角按行展开的序列完全一致。你之前写的预期序列漏了第二行开头的1,属于计数偏差。
内容的提问来源于stack exchange,提问作者Curly0606
相关产品推荐
相关产品推荐

