2015-09-25 39 views
1

我正在編寫一個加泰羅尼亞數字發生器的作業,我正在pytohon做一個遞歸程序。Python不遵循PEMDAS的順序?

程序:

def catalan(n): 
    if n == 0: 
     c_f = 1 
    else: 
     c_f = ((4*n-2)/(n+1))*catalan(n-1) 
    return c_f 

print catalan(10) 

回報5832,這是錯誤的答案,但

def catalan(n): 
    if n == 0: 
     c_f = 1 
    else: 
     c_f = (4*n-2)*catalan(n-1)/(n+1) 
    return c_f 

print catalan(10) 

給了我16796,這是正確的答案。

那麼python不遵循PEMDAS?

+0

你將不得不詳細說明... python粗跟隨pemdas ...也許你不太瞭解pemdas m == d和a == s,所以他們是簡單的從左到右的操作 –

回答

2

就像PEMDAS一樣,python從左到右評估表達式。它評估(4*n-2)/(n+1),存儲它(稱爲結果X),然後計算X/catalan(n-1)

的問題是,什麼是X價值? (4*n-2)/(n+1)是不是對於n的所有值的整數,但如果你正在傳遞的n的值是一個Python int您要執行整數除法。其結果是計算的小數部分被丟棄,並且您的計算離開軌道。

第二次迭代由於加泰羅尼亞函數的屬性而起作用,即(4*n-2)*catalan(n-1)表達式將是n-1的倍數。通過這種方式,您可以將(可能具有破壞性的)部分放在表達式的末尾,並且計算的數學屬性可以節省您的時間。