You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两段相似Python代码为何一段正常一段无限循环?total值未更新原因

问题分析:第二段Python代码的无限循环原因

两段Python代码预期实现相同逻辑,但第一段运行正常,第二段却触发无限循环——核心问题是total变量始终保持为1,没有随val的递增更新。

第一段正常代码

from collections import deque

contig = deque()
contig.append(2)
answer = 0
while contig:
    dist = contig.popleft()
    val = 0
    while pow(2, val) < dist:
        val += 1
    if pow(2, val) == dist:
        answer += 1
        val = 0
    elif pow(2, val) > dist:
        answer += 1
        contig.append(dist - pow(2, val - 1))
        val = 0

第二段触发无限循环的代码

from collections import deque

contig = deque()
contig.append(2)
answer = 0
while contig:
    dist = contig.popleft()
    val = 0
    total = pow(2, val)
    while total < dist:
        #print(total)
        #print(val)
        val += 1
    if total == dist:
        answer += 1
        val = 0
    elif total > dist:
        answer += 1
        contig.append(dist - pow(2, val - 1))
        val = 0

问题根源

第二段代码里,total = pow(2, val)只在val=0时执行了一次,得到结果1。后续在while循环中,val不断递增,但没有重新计算total的值,导致total永远是1。而dist初始值是2,total < dist的条件永远成立,循环会无限执行,val一直增大,触发无限循环。

反观第一段代码,每次判断循环条件时都会重新计算pow(2, val),能实时获取val对应的2的幂,所以能正常退出循环。

修复方法

把total的计算放到while循环内部,每次val更新后重新计算:

from collections import deque

contig = deque()
contig.append(2)
answer = 0
while contig:
    dist = contig.popleft()
    val = 0
    total = pow(2, val)
    while total < dist:
        val += 1
        total = pow(2, val)  # 每次val更新后重新计算total
    if total == dist:
        answer += 1
        val = 0
    elif total > dist:
        answer += 1
        contig.append(dist - pow(2, val - 1))
        val = 0

内容的提问来源于stack exchange,提问作者jojo33

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:57:08