计数变量无法终止while循环:获取前n个质数函数问题排查
问题分析与修复
你的first_primes函数问题出在两个核心点:
- 嵌套的
for循环会完整遍历range(2,1001)的所有数,哪怕count已经达到n,也不会中途停止 while循环的条件写成了count <=n,当count等于n时,仍会再执行一次循环体,导致多余质数被添加
修复后的代码
保留你验证正常的is_prime函数,重写first_primes即可解决问题:
def is_prime(n): primed = False if n > 1: for i in range(2, n): if n % i == 0: break else: primed = True else: primed = False return primed def first_primes(n): count = 0 primo = [] current_num = 2 while count < n: if is_prime(current_num): primo.append(current_num) count += 1 current_num += 1 return primo # 测试示例 print(first_primes(4)) # 输出 [2, 3, 5, 7]
原代码失效原因
原代码中,while循环每次执行都会触发整个for循环(从2遍历到1000),哪怕count在中途就达到了n,for循环也不会停止,会把所有符合条件的质数都加到列表里。同时while count <=n的条件,会让count等于n时再次进入循环,重复执行for循环,导致count持续增加,无法正常终止循环。
另外,如果你想优化is_prime的效率,可以把循环范围改成range(2, int(n**0.5)+1)——因为一个数若有因数,必然有一个因数小于等于它的平方根,这样能大幅减少循环次数:
def is_prime(n): if n <= 1: return False if n == 2: return True if n % 2 == 0: return False for i in range(3, int(n**0.5)+1, 2): if n % i == 0: return False return True
内容的提问来源于stack exchange,提问作者sbsutton98
相关产品推荐
相关产品推荐

