如何终止Python无限循环?代码逻辑异常排查与解决
解决生成每行至少含非零元素矩阵的无限循环问题
嘿,我一眼就看到你代码里的问题啦——当处理最后一行(i = n-1)的时候,你的逻辑永远生成不出非零元素,导致flag永远没法被设为False,直接陷入无限循环!
问题根源分析
你生成非零值的条件是:if w==1 and i<j。但当i是最后一行时(比如n=3,i=2),j的取值范围是0、1、2,根本不存在i<j的情况,所以这一行的a永远全是0。这时候a.count(0) == n,永远触发不了flag=False的条件,循环自然停不下来。
修正方案一:调整非零值生成逻辑
把i<j的限制去掉,只要i!=j且随机数w==1就生成非零值,这样每一行都有机会出现非零元素:
import random n=int(input()) array=[] for i in range(0,n): flag=True while flag: a=[] for j in range(0,n): if i!=j: w= random.randint(0,1) if w==1: # 去掉i<j的限制 v=random.randint(1,10) a.append(v) else: a.append(0) elif i==j: a.append(0) if a.count(0) !=n: flag=False array.append(a) print(array)
修正方案二:更高效的写法(直接保证每行非零)
其实没必要靠随机碰运气来生成符合要求的行,我们可以直接生成全0行,然后随机选一个非对角线的位置设为非零值,这样既高效又不会出现死循环:
import random n=int(input()) array=[] for i in range(n): a = [0]*n # 随机选一个不等于i的j位置,设置非零值 j = random.choice([x for x in range(n) if x != i]) a[j] = random.randint(1,10) array.append(a) print(array)
这个写法不仅避免了无限循环的问题,还减少了不必要的循环次数,代码也更简洁~
内容的提问来源于stack exchange,提问作者ANONYMOUS
相关产品推荐
相关产品推荐

