【ROSALIND】【练Python,学生信】15 孟德尔第二定律

如果第一次阅读本系列文档请先移步阅读【ROSALIND】【练Python,学生信】00 写在前面 谢谢配合~

题目:
孟德尔第二定律(Mendel's Second Law)
Given: Two positive integers k (k<7) and N (N<2k). In this problem, we begin with Tom, who in the 0th generation has genotype Aa Bb. Tom has two children in the 1st generation, each of whom has two children, and so on. Each organism always mates with an organism having genotype Aa Bb.
所给:两个正整数k(k<7)和N(N<2k)。亲代基因型为AaBb,有两个子一代,每个子一代又各产生两个子二代,以此类推,每代都与基因型为AaBb的个体交配。
Return: The probability that at least N Aa Bb organisms will belong to the k-th generation of Tom's family tree (don't count the Aa Bb mates at each level). Assume that Mendel's second law holds for the factors.
需得:在满足自由组合定律的前提下,第k代有至少N个AaBb基因型个体的概率(AaBb基因型的配偶不参与计算)。
测试数据
2 1
测试输出
0.684
背景
自由组合定律的内容是控制不同性状的遗传因子的分离和组合是互不干扰的,在形成配子时,决定同一性状的成对遗传因子彼此分离,决定不同性状的遗传因子自由组合。
自由组合定律表明一对相对性状的分离与另一对相对性状的分离无关,二者在遗传上是彼此独立的。
如果X、Y是两个独立的随机变量,A、B分别是X、Y中的事件,则A、B相互独立,满足Pr(A and B)=Pr(A)×Pr(B)
思路
从产生配子的概率来考虑,实际上每代得到基因型AaBb的概率都是1/4,因此可以把第k代个体看作有2^k次试验的二项分布,“成功”的概率是0.25,“失败”的概率是0.75。
题目要求得到至少有N个AaBb基因型个体的概率,实际上就是问有N、N+1、N+2…2^k-1、2^k次成功的概率。二项分布公式如下:

Python知识点
程序调用自身的编程技巧称为递归( recursion)。通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
阶乘适合用递归解决,即阶乘(n) = (n * 阶乘(n-1))。
代码
def factorial(n):
"""求阶乘"""
if n == 0:
return 1
else:
return n * factorial(n - 1)
k = 2
n = 1
m = 2 ** k
i = 2 ** k
p = 0
while i >= n: # 代入二项分布公式计算
p = p + (factorial(m) / (factorial(i)*factorial((m - i)))) * (0.25 ** i) * (0.75 ** (m-i))
i -= 1
print(round(p,3))