两段相似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
相关产品推荐
相关产品推荐

