Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Problema return

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    4

    Problema return

    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.

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: Problema return

    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.
    E' meglio se posti il codice per far capire meglio di cosa stai parlando, tanto da come lo descrivi dovrebbero bastare poche righe.

    (comunque si chiama ricorsione)
    effeffe

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    4
    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;
    	}

  4. #4

    Moderazione

    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    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;
    	}
    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.
    effeffe

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    4
    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.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    4
    Se modifico così il codice il valore alla fine è corretto, sapete dirmi il perchè?!
    codice:
     int temp=scorroMatrice(valore, clausole, matrice);
     clausole=temp;

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    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;
    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:

    codice:
    clausole = scorroMatrice(...);
    Leggi qui, dal paragrafo "Passing Primitive Data Type Arguments" in poi:
    http://docs.oracle.com/javase/tutori...arguments.html
    effeffe

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.