You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码说明

  1. 总个体数:先计算所有个体的总数total,处理特殊情况(个体数小于2时无法交配)。
  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。
  3. 显性概率:用1减去隐性概率即可得到结果。

这种方法避免了复杂的循环和条件判断,不会出现变量未定义的问题,同时计算结果准确可靠。

内容的提问来源于stack exchange,提问作者Mehmet İzmirli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:25:48