2014-01-19 100 views
5

我是編程新手,我正在尋找一種方法來查找矩陣的行列式。我在網上發現了這個代碼,但是我很難理解這裏的算法。我對遞歸的基礎沒有任何問題,但繼續和主循環我無法理解。非常感謝任何能向我解釋算法的人。矩陣行列式算法C++

int determ(int a[MAX][MAX],int n) { 
    int det=0, p, h, k, i, j, temp[MAX][MAX]; 
    if(n==1) { 
    return a[0][0]; 
    } else if(n==2) { 
    det=(a[0][0]*a[1][1]-a[0][1]*a[1][0]); 
    return det; 
    } else { 
    for(p=0;p<n;p++) { 
     h = 0; 
     k = 0; 
     for(i=1;i<n;i++) { 
     for(j=0;j<n;j++) { 
      if(j==p) { 
      continue; 
      } 
      temp[h][k] = a[i][j]; 
      k++; 
      if(k==n-1) { 
      h++; 
      k = 0; 
      } 
     } 
     } 
     det=det+a[0][p]*pow(-1,p)*determ(temp,n-1); 
    } 
    return det; 
    } 
} 
+4

它計算來自未成年人的行列式。內循環在'temp'中形成未成年人。另外,這是計算行列式的可怕方法。 –

+0

@ user3144334未成年人是一行一列丟棄的矩陣。這裏使用的未成年人都拋棄了第一行,並且拋棄第p列,在將元素從'a'複製到'temp'時,必須跳過它。 –

+0

計算具有超指數複雜度的行列式,做得好......甚至是一個'pow(-1,p)',以便一目瞭然,代碼是多麼的美好...... –

回答

8

該算法採用分治法解決問題(找到N * N矩陣的行列式)。

該算法使用遞歸模式,這是一種分而治之的方法。您可以通過注意到算法在第三個條件語句中調用它自己來了解這一點。

每個遞歸算法都有一個退出條件,它是代碼中的第一個if語句。而且它們還包含一個解決最方便問題的部分或者首要難以解決的主要大問題的原子問題。原子問題或最分裂的問題可以很容易地解決,因爲您可以看到代碼的第二個if語句。在你的情況下,它實際上是解決2 * 2矩陣的行列式。

您的代碼中最重要的部分是瞭解哪個部分更具挑戰性,那就是您進行分割的部分(也就是遞歸!)。 這部分也有徵服的關鍵。只要稍稍回溯和數值的例子,你可以找到它:

det = det + a[0][p] * pow(-1,p) * determ(temp,n-1); 

對於最終建議嘗試一個3×3矩陣只需要一個劃分。 祝你好運。

This book is a great one to start studying and understanding algorithms

+0

非常感謝我只想問一下continue語句是幹什麼的?如果j == p,那麼你直接跳到det = det + a [0] [p] * pow(-1,p)* determine(temp,n-1);或者是其他東西 ? – user3144334

+0

@ user3144334噢,你只是不知道'繼續'是...(...){if(x){continue; } b; C; }'相當於'for(...){if(!x){b; C; }}。 –

+0

它繼續'for'循環以再執行一次。檢查了這一點:http://www.cplusplus.com/doc/tutorial/control/ - 繼續可用於所有有條件的語句:http://www.tutorialspoint.com/cplusplus/cpp_continue_statement.htm –