Python 3.x中IPRB代码出现NameError: pr31未定义的原因排查
解决ROSALIND IPRB问题的代码错误修复
首先,你遇到的NameError: name 'pr31' is not defined问题,根源在于代码的循环逻辑设计有缺陷:你通过遍历[k,m,n]这个数值列表来处理三种基因型,但当存在重复数值(比如测试用例里k=m=25)时,会导致代码分支被重复执行,甚至在某些边界场景下,变量无法被正确赋值。
举个例子,当k和m数值相同时,for i in org会两次触发i==k和i==m的分支,重复计算pr1和pr2——虽然在k=m=n=2的示例中结果碰巧正确,但这种逻辑非常不稳定,容易出现变量未定义的情况。
更简洁且可靠的解决方案
ROSALIND的IPRB问题核心是计算显性后代的概率,我们可以通过先计算隐性后代的概率,再用1减去它的方式实现,逻辑清晰且不易出错:
# 输入你的基因型数量 k = 25 m = 25 n = 19 total = k + m + n if total < 2: # 特殊情况:只有一个个体,无法交配,显性概率为0 print(0.0) else: # 计算隐性后代的概率 recessive_prob = 0.0 # 1. Aa与Aa交配,产生aa的概率是0.25 recessive_prob += (m * (m - 1)) / (total * (total - 1)) * 0.25 # 2. Aa与aa交配(两种方向:Aa选第一个或aa选第一个),产生aa的概率是0.5 recessive_prob += (m * n + n * m) / (total * (total - 1)) * 0.5 # 3. aa与aa交配,产生aa的概率是1.0 recessive_prob += (n * (n - 1)) / (total * (total - 1)) * 1.0 # 显性概率 = 1 - 隐性概率 dominant_prob = 1 - recessive_prob print(dominant_prob)
代码说明
- 总个体数:先计算所有个体的总数
total,处理特殊情况(个体数小于2时无法交配)。 - 隐性概率计算:
- Aa和Aa交配:从m个Aa中选2个,概率是
m*(m-1)/(total*(total-1)),乘以产生隐性后代的概率0.25。 - Aa和aa交配:包含两种情况(先选Aa再选aa,或先选aa再选Aa),所以概率是
2*m*n/(total*(total-1)),乘以0.5。 - aa和aa交配:从n个aa中选2个,概率是
n*(n-1)/(total*(total-1)),乘以1.0。
- Aa和Aa交配:从m个Aa中选2个,概率是
- 显性概率:用1减去隐性概率即可得到结果。
这种方法避免了复杂的循环和条件判断,不会出现变量未定义的问题,同时计算结果准确可靠。
内容的提问来源于stack exchange,提问作者Mehmet İzmirli
相关产品推荐
相关产品推荐

