Страница 1 из 1

Задача на рекурсию....

Добавлено: 26 май 2010, 10:17
dieselboy
Нужен код где программа считает определитель любой размерности, реализация через рекурсию... Плиз Хэлп..))

Re: Задача на рекурсию....

Добавлено: 26 май 2010, 10:27
Romeo
Воспользуйся поиском. Эта тема неоднократно поднималась на страничках нашего форума.

Re: Задача на рекурсию....

Добавлено: 26 май 2010, 11:07
Iworb
посмотрите вот этот заголовочный файл, написанный моим знакомы, который должен решать подобное:

Код: Выделить всё

//matrix.h
#ifndef __MATRIX_H
#define __MATRIX_H

#ifndef __IOSTREAM_H
#include<iostream.h>
#endif

class matrix
{
  double **a;
  int n;
  public:
  ~matrix();
  matrix(int c=3,int f=1); //f-flag of creation
  matrix(int c,double **t);
  matrix(const matrix &m);
  matrix operator+(matrix& x);
  matrix operator*(matrix& x);
  matrix operator*(double x);
  matrix& operator=(matrix& x);
  matrix dminor(int x,int y);
  double algd(int x,int y);
  friend double det(matrix x);
  friend matrix obr(matrix x);
  friend istream& operator>>(istream& in,matrix& mt);
  friend ostream& operator<<(ostream& on,matrix& m);
};
//----------------------Constructors and destructors--------------------------
matrix::~matrix()
{ for(int i=0;i<n;i++)delete[]a[i];
  delete[]a;}

matrix::matrix(int c,int f)
{ n=c;
  a=new double*[n];
  for(int k=0;k<n;k++)a[k]=new double[n];
  if(f==1)
  {
	 for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
		  if(i==j)a[i][j]=1;else a[i][j]=0;
  }
  else if(f==0)
  {
	  for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
		  a[i][j]=0;
  }
}
matrix::matrix(int c,double **t)
{ n=c;
  a=new double*[3];
  for(int k=0;k<n;k++)a[k]=new double[3];
  for(int i=0;i<n;i++) for(int j=0;j<n;j++) a[i][j]=t[i][j];}

matrix::matrix(const matrix &m)
{ n=m.n;
  a=new double*[n];
  for(int i=0;i<n;i++)a[i]=new double[n];
  for(int i=0;i<n;i++)
	 for(int j=0;j<n;j++)
		a[i][j]=m.a[i][j];}
//----------------------Fucnction-members-------------------------------------
matrix matrix: :o perator+(matrix &x)
{ matrix z=matrix(n);
  for(int i=0;i<n;i++) for(int j=0;j<n;j++) z.a[i][j]=a[i][j]+x.a[i][j];
  return z;
}

matrix matrix: :o perator*(matrix& x)
{
  matrix z(n,0);
  for(int i=0;i<n;i++)
	 for(int j=0;j<n;j++)
		for(int k=0;k<n;k++)
		  z.a[i][j]+=a[i][k]*x.a[k][j];
  return z;
}

matrix matrix: :o perator*(double x)
{
  matrix z(n);
  for(int i=0;i<n;i++)
	 for(int j=0;j<n;j++)
		z.a[i][j]=a[i][j]*x;
  return z;
}

matrix& matrix: :o perator=(matrix& x)
{
  n=x.n;
  a=new double*[n];
  for(int i=0;i<n;i++)a[i]=new double[n];
  for(int i=0;i<n;i++)
	 for(int j=0;j<n;j++)
		a[i][j]=x.a[i][j];
  return *this;
}

matrix matrix::dminor(int x,int y)
{ int i,j,n1=n-1;
  matrix z=matrix(n1);
  for(i=0;i<x;i++) for(j=0;j<y;j++)z.a[i][j]=a[i][j];
  for(i=x;i<n1;i++)for(j=0;j<y;j++)z.a[i][j]=a[i+1][j];
  for(i=0;i<x;i++)for(j=y;j<n1;j++)z.a[i][j]=a[i][j+1];
  for(i=x;i<n1;i++)for(j=y;j<n1;j++)z.a[i][j]=a[i+1][j+1];
  return z;
}

double matrix::algd(int x,int y)
{
  double d=det(dminor(x,y));
  if((x+y)%2==0)return d;else return -d;}
//-------------------------function-friends-----------------------------------
double det(matrix x)
{ int n=x.n;
  double d=0;
  if(n==1)return x.a[0][0];
  else if(n==2)d=x.a[0][0]*x.a[1][1]-x.a[0][1]*x.a[1][0];
  else
	 {
		 for(int i=0;i<n;i++)
			d+=x.a[0][i]*x.algd(0,i);
	 }
  return d;
}

matrix obr(matrix x)
{
  double detx=det(x);
  int n=x.n,i,j;
  if(detx==0)return matrix(n,0);
  matrix z=matrix(n);
  for(i=0;i<n;i++)
	 for(j=0;j<n;j++)
		 z.a[j][i]=x.algd(i,j)/detx;
  return z;
}

istream& operator>>(istream& in,matrix& mt)
{
  int n=mt.n;
  for(int i=0;i<n;i++)
	 for(int j=0;j<n;j++)
		in>>mt.a[i][j];
  return in;
}

ostream& operator<<(ostream& on,matrix& m)
{
  int n=m.n;
  for(int i=0;i<n;i++)
	 {
		on<<"\n";
		for(int j=0;j<n;j++)
		  on<<m.a[i][j]<<" ";
	 }
  on<<"\n";
  return on;
}
#endif