Определитель матрицы: функция глючит или я чёт не догоняю?

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
De_METAL
Сообщения: 2
Зарегистрирован: 20 ноя 2005, 02:53

Доброе время суток!
Тут у меня тупая до безобразия прога, должна рекурсивно вызываться и считать определитель матрицы [n*n[ методом миноров. [3*3] она считает нормально, а [4*4] и больше - неправильно..
Когда запустил пошаговое выполнение, получилась такая вот фига - в функции DetArr задаются локальные переменные var c,i,j,k,d,s:integer; так вот, сразу после входа в функцию s=4229568, но это ладно, после
первого рекурсивного вызова функции и дальше каждый раз в самом начале выполнения функции устанавливаются такие значения:
s=124505б k=4212442, d=1245080.... естесственно, определитель получается хрен пойми какой...

Может, кто знает, в чём лажа? Напишите плиз сюда или в аську 255-758-058

Прога вот:


program De_Arr_1;
{$APPTYPE CONSOLE}
uses SysUtils;

type TArr=array of array of integer;
var V, VOrig: TArr;
MOpred,i,j,n: integer;

procedure ArrIn (V:TArr);
begin
for j:=low(V) to high(V) do
for i:=low(V[0]) to high(V[0]) do V[i,j]:=random(9)+1;
end;

procedure ArrOut (V:TArr);
begin
for i:=low(V) to high(V) do
for j:=low(V[0]) to high(V[0]) do write (V[i,j],' ');

function DetArr (V:TArr; n:integer):integer;
var c,i,j,k,d,s:integer;
Vd:Tarr;
begin
if high(V)=1 then d:=V[0,0]*V[1,1]-V[0,1]*V[1,0];
else begin
for s:=0 to n-1 do begin
setlength(Vd,n-1,n-1);
if odd(s) then k:=(-1) else k:=1;
c:=0;
for j:=0 to high(V) do begin
if j<>s then begin
for i:=1 to high(V) do Vd[i-1, c]:=V[i,j];
inc(c);
end;
end; // zapolnenie massiva Vd [n-1..n-1]
d:=d+k*V[0,s]*DetArr(Vd,n-1);
end;
end;
DetArr:=d;
end;

begin
// randomize;
mopred:=0;
writeln ('Enter array dimensions'); readln(n);
setlength(V,n,n);
ArrIn(V); ArrOut(V);

If n>=2 then MOpred:=DetArr(V,n);
writeln('Opredelitel=',MOpred);
readln;
end.
De_METAL
Сообщения: 2
Зарегистрирован: 20 ноя 2005, 02:53

ха! работает.. вот только почему???? просто написал в функции после begin
d:=0;
сам не понял почему, но суммарное значение d при рекурсивном вызове в таком случае не обнулнется!!!
УРЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ!!!!!
Ответить