Tablica c++ zawiesza się

0

Mam następujący kod programu:

double Macierz::det(int st,int wi,int *wk,Macierz &a)
{
  int k,m;
  int *ko;
  double s;
  if(st == 1)
      return a.Pobierz(wi,wk[0]);
  else{
      ko = new int[a.Kolumny() - 1];
      s=0; m=1;
      for(int i=0;i<st;i++){
          k=0;
          for(int j=0;j<st-1;j++){
              if(k==i) k++;
              ko[j]=wk[k++];
          }
          s += m*a.Pobierz(wi,wk[i])*det(st-1,wi+1,ko,a);
         m=-m;
      }
      delete [] ko;
      return s;
  }
} 
QString Macierz::Wyznacznik(Macierz& A)
{
    int     * WK;
    for(int i = 0; i < A.Kolumny(); i++)
        WK = new int[A.Kolumny()];
    QString wyp;
    for(int i=0;i<A.Kolumny();i++)
    WK[i]=i;

wyp.append(QString("%1").arg(det(A.Kolumny(),0,WK,A)));
delete [] WK;

return wyp;
}

 
 A_Wczytaj();
            ui->textEdit_2->setText(A.Wyznacznik(A)); 

i tak jeśli mam 10x10 to jeszcze działa ale jeśli dam 20x20 to program się zawiesza wiem że to jest przez to że musi wykonać dużą
liczbę obliczeń ale pytanie czy mogę to jakoś przyspieszyć zmodyfikować żeby lepiej działało

0

Spróbuj pozbyć się rekurencji. W funkcji det masz pętlę w pętli, a w pierwszej pętli rekurencyjne wywołanie funkcji, która znowu wywołuje pętlę w pętli. O ile się nie mylę, to złożoność obliczeniowa może być tutaj wykładnicza i przez to przy tablicy o sporych wymiarach program może się zawieszać. Są różne metody na pozbywanie się rekurencji. Poszukaj informacji na ten temat. W książce Piotra Wróblewskiego o algorytmach jest temu poświęcony cały rozdział. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1