Salve è possibile che in un metodo che richiama se stesso un return di un valore, che nel metodo viene solo incrementato, automaticamente mi decrementi il valore stesso!?
Grazie a chi riesce a togliermi da questo inghippo.
Salve è possibile che in un metodo che richiama se stesso un return di un valore, che nel metodo viene solo incrementato, automaticamente mi decrementi il valore stesso!?
Grazie a chi riesce a togliermi da questo inghippo.
E' meglio se posti il codice per far capire meglio di cosa stai parlando, tanto da come lo descrivi dovrebbero bastare poche righe.Originariamente inviato da KJava
Salve è possibile che in un metodo che richiama se stesso un return di un valore, che nel metodo viene solo incrementato, automaticamente mi decrementi il valore stesso!?
Grazie a chi riesce a togliermi da questo inghippo.
(comunque si chiama ricorsione)
effeffe
codice:public int scorroMatrice (int valore, int clausole, ArrayList<ArrayList<Integer>> matrice) { int i=0; while (i<matrice.size()) { if (matrice.get(i).contains(valore)) { matrice.remove(i); clausole++; } else { if (matrice.get(i).contains(-valore)) { if(matrice.get(i).indexOf(-valore)==0) { pos=1; } else { pos=0; } valore=matrice.get(i).get(pos); if (letterali.get(Math.abs(valore)-1)==-1) { if (valore<0) { letterali.set(Math.abs(valore)-1, 0); } else { letterali.set(Math.abs(valore)-1, 1); } matrice.remove(i); clausole++; ** scorroMatrice(valore, clausole, matrice); } else { if (letterali.get(pos)==1||letterali.get(pos)==0) { return 0; } } } else { i++; } } } ridotta=matrice; return clausole; }
Benvenuto sul forum!Ti ricordo che il codice va specificato tra tag [CODE] ... [/CODE], altrimenti perde l'indentazione.
Ora correggo io, in futuro imposta correttamente la discussione fin da subito; nel frattempo ti consiglio di dare un'occhiata al regolamento.
![]()
Amaro C++, il gusto pieno dell'undefined behavior.
Visto che a differenza di quanto pensassi non si tratta proprio di due righe sarebbe stato utile sapere lo scopo del codice, qual è il comportamento che ti aspetteresti e quale invece quello che riscontri... comunque, se ti aspetti che la chiamata ricorsiva modifichi la variabile "clausole" ovviamente non è così siccome il passaggio dei parametri in Java è per valore.Originariamente inviato da KJava
codice:public int scorroMatrice (int valore, int clausole, ArrayList<ArrayList<Integer>> matrice) { int i=0; while (i<matrice.size()) { if (matrice.get(i).contains(valore)) { matrice.remove(i); clausole++; } else { if (matrice.get(i).contains(-valore)) { if(matrice.get(i).indexOf(-valore)==0) { pos=1; } else { pos=0; } valore=matrice.get(i).get(pos); if (letterali.get(Math.abs(valore)-1)==-1) { if (valore<0) { letterali.set(Math.abs(valore)-1, 0); } else { letterali.set(Math.abs(valore)-1, 1); } matrice.remove(i); clausole++; ** scorroMatrice(valore, clausole, matrice); } else { if (letterali.get(pos)==1||letterali.get(pos)==0) { return 0; } } } else { i++; } } } ridotta=matrice; return clausole; }
effeffe
Scusate per non aver messo il codice tra le parole chiave.
Un po' complesso spiegarlo cosí comunque devo scorrere una matrice e vedere quante righe della tabella (clausole) sono vere. Ai singoli passaggi mi deve tenere il conte di quante clausole sono vere.
Eseguendo il debug l'incremento funziona finchè non arriva ad eseguire la riga dove ho messo i due asterischi dove, invece che incrementare la variabile inizia ad assumere valori inferiori.
Se modifico così il codice il valore alla fine è corretto, sapete dirmi il perchè?!
codice:int temp=scorroMatrice(valore, clausole, matrice); clausole=temp;
Te l'ho detto, in Java il passaggio dei parametri è per valore: il metodo scorroMatrice (chiamato ricorsivamente) riceve una copia della variabile clausole, quindi non può modificare l'originale. Comunque non serve una variabile temporanea:Originariamente inviato da KJava
Se modifico così il codice il valore alla fine è corretto, sapete dirmi il perchè?!
codice:int temp=scorroMatrice(valore, clausole, matrice); clausole=temp;
Leggi qui, dal paragrafo "Passing Primitive Data Type Arguments" in poi:codice:clausole = scorroMatrice(...);
http://docs.oracle.com/javase/tutori...arguments.html
effeffe