【ROSALIND】【練Python,學(xué)生信】15 孟德爾第二定律

如果第一次閱讀本系列文檔請(qǐng)先移步閱讀【ROSALIND】【練Python,學(xué)生信】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.
所給:兩個(gè)正整數(shù)k(k<7)和N(N<2k)。親代基因型為AaBb,有兩個(gè)子一代,每個(gè)子一代又各產(chǎn)生兩個(gè)子二代,以此類推,每代都與基因型為AaBb的個(gè)體交配。
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個(gè)AaBb基因型個(gè)體的概率(AaBb基因型的配偶不參與計(jì)算)。
?
測(cè)試數(shù)據(jù)
2 1
測(cè)試輸出
0.684
?
背景
自由組合定律的內(nèi)容是控制不同性狀的遺傳因子的分離和組合是互不干擾的,在形成配子時(shí),決定同一性狀的成對(duì)遺傳因子彼此分離,決定不同性狀的遺傳因子自由組合。
自由組合定律表明一對(duì)相對(duì)性狀的分離與另一對(duì)相對(duì)性狀的分離無(wú)關(guān),二者在遺傳上是彼此獨(dú)立的。
如果X、Y是兩個(gè)獨(dú)立的隨機(jī)變量,A、B分別是X、Y中的事件,則A、B相互獨(dú)立,滿足Pr(A?and?B)=Pr(A)×Pr(B)
?
思路
從產(chǎn)生配子的概率來(lái)考慮,實(shí)際上每代得到基因型AaBb的概率都是1/4,因此可以把第k代個(gè)體看作有2^k次試驗(yàn)的二項(xiàng)分布,“成功”的概率是0.25,“失敗”的概率是0.75。
題目要求得到至少有N個(gè)AaBb基因型個(gè)體的概率,實(shí)際上就是問有N、N+1、N+2…2^k-1、2^k次成功的概率。二項(xiàng)分布公式如下:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ?

?
Python知識(shí)點(diǎn)
程序調(diào)用自身的編程技巧稱為遞歸( recursion)。通常把一個(gè)大型復(fù)雜的問題層層轉(zhuǎn)化為一個(gè)與原問題相似的規(guī)模較小的問題來(lái)求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。
階乘適合用遞歸解決,即階乘(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:? # 代入二項(xiàng)分布公式計(jì)算
??? p = p + (factorial(m) / (factorial(i)*factorial((m - i)))) * (0.25 ** i) * (0.75 ** (m-i))
??? i -= 1
print(round(p,3))