PDA

View Full Version : [C++]Ricorsione su matrice


repla
16-01-2009, 20:05
Salve a tutti...
per l'uni ho scritto un programma di ricorsione su matrice...
il codice è questo
#include <iostream>

using namespace std;
const int L=3;

bool unitaria(int mat[][L],int i,int j,int N){
if(i==N){
return true;
}
else{
if(j<N){
if(((i==j)&&(mat[i][j]!=1))||(i!=j)&&(mat[i][j]!=0)){
return false;
}
unitaria(mat,i,j+1,N);}
else{
unitaria(mat,i+1,0,N);
}

}
}

int main(){
int index,index1;
index=0;
index1=0;
int matrice[L][L];
for(int i=0;i<L;i++){
for(int j=0;j<L;j++){
cout<<"Valore ["<<i<<"]["<<j<<"]"<<endl;
cin>>matrice[i][j];
}
}
for(int i=0;i<L;i++){
for(int j=0;j<L;j++){
cout<<matrice[i][j]<<" ";
}
cout<<endl;
}
cout<<"Risultato della funzione: "<<unitaria(matrice,index,index1,L)<<endl;
system("pause");
}


Il programma non fa altro che controllare se la matrice è unitaria...cioè se in [0][0]..[1][1]..[2][2]..e cosi via, ci sono gli uno e nel resto dei campi della matrice ci sono 0.
Ora il problema è questo..
Lo stesso programma, con gli stessi valori compilato da codeblocks mi ritorna sempre false alla funzione(anche con valori con cui dovrebbe tornare true), mentre con visual c++ express funziona correttamente.
Sto da una giornata a cercare di capire il perchè ma nn riesco a venirne a capo.

Grazie a coloro che mi aiuteranno.

Ciao

DanieleC88
17-01-2009, 00:29
Se la ripensi un attimo la puoi migliorare: fai lavorare gli indici separatamente e cerca di capire quando incrementarli e quando non incrementarli, il resto è solo un test di eguaglianza + chiamata ricorsiva. ;)

repla
17-01-2009, 10:25
Se la ripensi un attimo la puoi migliorare: fai lavorare gli indici separatamente e cerca di capire quando incrementarli e quando non incrementarli, il resto è solo un test di eguaglianza + chiamata ricorsiva. ;)

ci penso sul come migliorarla...ma questa è la copia di un programma scritto dal prof:D

Rimane solo il problema tra codeblock e vsual c++.

Ciao

DanieleC88
17-01-2009, 11:58
ci penso sul come migliorarla...ma questa è la copia di un programma scritto dal prof:D
:eekk: :wtf: :mbe:
Ma chi c'avete come prof, topo Gigio? :asd:

bool unitaria(int mat[][L],int i,int j,int N){
if(i==N){
return true;
}
else{
if(j<N){
if(((i==j)&&(mat[i][j]!=1))||(i!=j)&&(mat[i][j]!=0)){
return false;
}
unitaria(mat,i,j+1,N);}
else{
unitaria(mat,i+1,0,N);
}

}
}
A parte che è un po' "intrecciata" come codice, ma come spera il prof di dare dei risultati giusti se fa le chiamate ricorsive senza il return? O senza passare il risultato intermedio come parametro? La soluzione finale dove la prende? :D

A questo punto mi meraviglio di come possa funzionare su Visual C++... sarà magico. :D

repla
17-01-2009, 13:49
per il return c'era un appunto a penna...stupido io a non pernsarci prima...

Ora il codice funziona sia su codeblock che su visual c++.
Non so però perchè prima su visual c++ funzionava ugualmente...

Ora devo passare solo a migliorare la funzione...

Ciao e grazie...

DanieleC88
17-01-2009, 13:58
Capita... buono studio. :)