學數學的好處(記一次機率論的應用)

今天上午,和往常同樣開開心心的從別處找一個功能類似的代碼。複製粘貼正準備乾的時候,突然感受這段代碼有些詭異,遂細細的看了看,更越以爲不對了。

這段代碼大概長這樣。python

# 這裏有兩個列表,每一個列表有一些元素
s1 = []
s2 = []

# 這裏有個函數,作了些什麼
def func(a, b):
    if b in s1 and a not in s1:
        return b
    if a in s1:
        return a
    if b in s2 and a not in s2:
        return b
    return a
複製代碼

是否是你們也以爲這個代碼有問題。函數

直覺上感受這裏的if能夠簡化下,但不知道怎麼簡化。想到最近剛學了點機率論,這裏好像能夠用一下。優化

先定義四個事件spa

A = {a in s1}.net

B = {b in s1}code

C = {第一個return return b}cdn

D = {第二個return return a}blog

而後,將上面的代碼轉成數學表達式事件

b in s1 and a not in s1 => B \cap \overline{A}數學

a in s1 => A

那麼

\begin{eqnarray*}
p(C) &=& p( B \cap \overline{A} )\\
&=& p(  \overline{A} \cap B )
\end{eqnarray*}
\begin{eqnarray*}
p(D) &=& p(\overline{ C } \cap A )\\
&=& p(\overline{ B \cap \overline{A} } \cap A )\\
&=& p( (\overline{B} \cup A) \cap A )\\
&=& p( \overline{B} A \cup A A )\\
&=& p( \overline{B} A \cup A )\\
&=& p(A)
\end{eqnarray*}

這樣就很清晰了,當A發生時,返回a;當A不發生且B發生時,返回b。

因而前兩個if能夠優化爲

if a in s1:
    return a
if b in s1:
    return b
複製代碼

按照這個方法,能夠把代碼優化成這樣

def func(a, b):
    if a in s1:
        return a
    if b in s1:
        return b
    if a in s2:
        return a
    if b in s2:
        return b
    return a
複製代碼

邏輯和以前徹底一致,可是代碼清晰了不少。

從這個例子中,我品嚐到數學的快樂,堅決了我繼續學下去的信念。

相關文章
相關標籤/搜索