修改C++代码第48行判断条件为大于后触发无限循环,求原因
程序修改条件后进入无限循环的原因
问题背景
原C++代码通过while(leaves(n))循环迭代处理特定叶子节点,当把循环体内第48行的判断条件从strength[i] < strength[0]改为strength[i] > strength[0]后,程序陷入无限循环。
核心原因
问题出在循环终止条件与循环体逻辑完全脱节:
- 控制循环是否继续的
leaves()函数未同步修改,它仍然在检查是否存在「未被移除(otm[i]==1)的叶子节点(past[i]==0)且strength[i] < strength[0]」,只要存在这类节点,就返回true让循环持续执行。 - 但修改后的循环体,仅处理「
strength[i] > strength[0]」的叶子节点,完全不会触碰那些strength[i] < strength[0]的叶子节点。
一旦运行时存在满足otm[i]==1 && past[i]==0 && strength[i] < strength[0]的节点:
leaves()返回true,触发while循环;- 循环体内找不到符合新条件的节点,
otm和past数组完全没有变化; - 下一轮循环时,
leaves()依然会检测到相同的节点并返回true,循环无限重复。
典型场景
比如输入中存在一个叶子节点,其strength值小于根节点(strength[0])且未被标记移除:
leaves()始终判定有需要处理的节点,让循环持续运行;- 但循环体只处理
strength更大的节点,对该节点完全不做处理; - 最终程序陷入死循环,无法退出
while逻辑。
内容的提问来源于stack exchange,提问作者Yuri Korostelev
相关产品推荐
相关产品推荐

