2015-06-27 69 views
1

我做了一個遞歸函數來計算矩陣的行列式的基礎上,輔助因子:Python的遞歸決定

# determinant of a 2x2 matrix 
def det2(matrix): 
    return matrix[0][0]*matrix[1][1]-matrix[1][0]*matrix[0][1] 

# recursive part 
def recursion(matrix,somme=None,prod=1): 
    if(somme==None): 
     somme=[] 
    if(len(matrix)==1): 
     somme.append(matrix[0][0]) 
    elif(len(matrix)==2): 
     somme.append(det2(matrix)*prod) 
    else: 
     for index, elmt in enumerate(matrix[0]): 
      transposee = [list(a) for a in zip(*matrix[1:])] 
      transposee.remove(transposee[index]) 
      mineur = [list(a) for a in zip(*transposee)] 
      somme = recursion(mineur,somme,prod*matrix[0][index]*(-1)**(index+2)) 
    return somme 

def main(matrix): 
    return sum(recursion(matrix)) 

沒有什麼複雜的,但我不明白爲什麼這是行不通的。它確實在某些情況下給出了正確的答案,但並非全部。 當矩陣中有0時,我懷疑結果是錯誤的,但我不確定。

如果您有任何想法,

感謝

+3

你能給出一個輸入矩陣的例子,其結果是不正確的,幷包括不正確的和所需的結果? – mkrieger1

+0

[[4,6,3,5,1],[1,4,5,3,7],[6,5,1,5,6],[8,5,3,4,3], [6,0,7,0,7]] 預期結果:1335 結果:4695 – user5049567

回答

3

我覺得你的問題很可能是在這裏:

transposee.remove(transposee[index]) 

remove刪除第一 occurence從傳遞給它的價值list。您的測試矩陣有多個重複值,因此刪除的值可能不是您想要刪除的值來創建您的mineur陣列。

您的算法適用於隨機數組,因爲在這種情況下不太可能發生這樣的重複。

爲了使您的工作方案,與

del transposee[index] 

將在index專門刪除值替換線。