为何Python的findPrimes函数未将3识别为质数?代码问题咨询
质数生成函数逻辑错误分析与修复
问题重现
以下代码中,单独调用isItPrime(3)返回'true',但findPrimes(10)生成的质数列表却缺失了3,仅返回[2, 5, 7, 11, 13, 17, 19, 23, 29, 31];将findPrimes中x的初始值改为3时,3能被正常识别并加入列表。
import math # 原代码遗漏math模块导入,需补充才能正常运行 def isItPrime(n): p='true' if not n==2: for x in range(2,round(math.sqrt(n))+1):# 取平方根提升效率,+1避免生成range(2,2)这类空范围 if n%x==0: p='false' break return p def findPrimes(n): primes=[] x=2 # 改成3时能识别3为质数 while len(primes)<n: if isItPrime(x)=='true': primes.append(x) x+=1 x+=1 return primes print(isItPrime(3)) # true print(findPrimes(10)) # [2, 5, 7, 11, 13, 17, 19, 23, 29, 31]
错误原因
问题出在findPrimes的循环逻辑上:
- 初始
x=2时,isItPrime(2)返回'true',执行primes.append(2)后,先执行if块内的x+=1(x变为3); - 紧接着又执行if块外的
x+=1,x直接跳到4,完全跳过了对x=3的检查; - 当x初始值设为3时,第一次循环直接检查3,满足条件加入列表后,x先加1到4,再加1到5,不会遗漏数字,所以3能被正常识别。
修复方案
把x的递增逻辑统一放在循环末尾,确保每个数字都被检查一次:
def findPrimes(n): primes=[] x=2 while len(primes)<n: if isItPrime(x)=='true': primes.append(x) x+=1 # 统一在这里递增x,保证每个数都被遍历 return primes
修复后调用findPrimes(10)会返回正确的质数列表:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]。
额外优化建议:
- 用Python原生布尔值
True/False代替字符串'true'/'false',更符合语言规范,修改后的isItPrime函数如下:
def isItPrime(n): if n == 2: return True for x in range(2, round(math.sqrt(n)) + 1): if n % x == 0: return False return True
内容的提问来源于stack exchange,提问作者BKTiv
相关产品推荐
相关产品推荐

