Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Perchè il mio programma funziona? :O

    codice:
    	public static void mazeTraversal (int rig, int col)
    	{
    		matrice[rig][col] = 'x';
    		print();
    		
    		if (rig == 4 && col == 11)
    		{
    			return;
    		}		
    		
    		if (matrice[rig][col + 1] == '.')
    			mazeTraversal (rig, col + 1);
    		
    		else if (matrice[rig + 1][col] == '.')
    			mazeTraversal (rig + 1, col);
    		
    		else if (matrice[rig][col - 1] == '.')
    			mazeTraversal (rig, col - 1);
    			
    		else if (matrice[rig - 1][col] == '.')
    			mazeTraversal (rig - 1, col);
    	}
    Salve a tutti! Ho un problema: non capisco perchè un programma che ho creato funziona bene! Mi spiego meglio... Prima creo un labirinto (dichiarando una matrice e riempendola di simboli, dove il punto (.) rappresenta il corridoio e quindi dove è possibile passare, il cancelletto (#) invece rappresenta il muro e quindi non si può passare, ed infine c'è la "x" che rappresenta la posizione attuale in cui si trova il "topolino" che sta progressivamente raggiungendo l'uscita...

    La casella d'uscita si trova alla posizione [4][11], quindi ad ogni chiamata del metodo ricorsivo mazeTraversal, verifico con una condizione se attualmente ci troviamo o no in quella casella. Se la condizione è vera, vuol dire che il "topolino" ha raggiunto la fine e quindi il programma deve terminare, e quindi viene eseguita l'istruzione "return"... ma mi sorge un dubbio, io con return, dovrei ritornare alla chiamata precedente di mazeTraveral giusto? Alla chiamata precedente però non eravamo di certo alla posizione [4][11], quindi in teoria si dovrebbe entrare in un loop infinito... ma invece il programma termina correttamente, come è possibile? o_O

  2. #2
    Utente di HTML.it L'avatar di Metflar
    Registrato dal
    Apr 2007
    Messaggi
    790
    "io con return, dovrei ritornare alla chiamata precedente di mazeTraveral giusto?" in che senso?
    con return ritorni un valore in quel caso void :master:
    conoscenze: C/C++, Java, PHP, Python
    [No PM tecnici o di qualsiasi genere]

  3. #3
    Originariamente inviato da Metflar
    "io con return, dovrei ritornare alla chiamata precedente di mazeTraveral giusto?" in che senso?
    con return ritorni un valore in quel caso void :master:
    Forse sto facendo un pò di confusione Con return io ritorno un valore alla chiamata precedente, e continuo dal punto in cui ho iniziato la chiamata appena stata terminata... ma nella chiamata precedente, rig e col non dovrebbero avere i valori di quella chiamata e non di quella che è stata appena eseguita?? Spero di essermi spiegato abbastanza XD

  4. #4
    Ho creato una classe d'esempio per vedere gli effetti dello script

    codice:
    /**
     *
     * @author Claudio Reggiani
     */
    public class Traversed {
       
       public static char[][] matrice = {
          {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
          {'#', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '#'},
          {'#', '.', '#', '#', '#', '#', '.', '#', '#', '#', '.', '#', '#'},
          {'#', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '#'},
          {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '.', '#'},
          {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '.', '#'},
          {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
       };
    
       public static void mazeTraversal (int rig, int col)
    	{
    		matrice[rig][col] = 'x';
    		//print();
          System.out.println(rig + " - "+col);
    		
    		if (rig == 4 && col == 11)
    		{
    			return;
    		}		
    		
    		if (matrice[rig][col + 1] == '.')
    			mazeTraversal (rig, col + 1);
    		
    		else if (matrice[rig + 1][col] == '.')
    			mazeTraversal (rig + 1, col);
    		
    		else if (matrice[rig][col - 1] == '.')
    			mazeTraversal (rig, col - 1);
    			
    		else if (matrice[rig - 1][col] == '.')
    			mazeTraversal (rig - 1, col);
    	}
       
       public static void print() {
          for (int i=0; i<7; i++) {
             for (int j=0; j<13; j++) {
                System.out.print(matrice[i][j]);
             }
             System.out.println();
          }
       }
    }
    con la seguente chiamata dal main:

    codice:
       public static void main (String args[]) {
          Traversed.mazeTraversal(1, 1);
          Traversed.print();
       }
    Con il seguente risultato in output:

    codice:
    1 - 1
    1 - 2
    1 - 3
    1 - 4
    1 - 5
    1 - 6
    1 - 7
    1 - 8
    1 - 9
    1 - 10
    1 - 11
    #############
    #xxxxxxxxxxx#
    #.####.###.##
    #...........#
    ###########.#
    ###########.#
    #############
    l'output mi dice che il topolino ha percorso tutta la prima colonna, poi si è fermato perchè?

    A causa dell'istruzione

    codice:
    matrice[rig][col] = 'x';
    Il puntino "." viene sostituito definitivamente da "x" !!! Ecco dov'è il trucco. In questa ultima posizione (1, 11) il topolino non può più tornare indietro da un vicolo cieco perchè è circondato per tre lati da # e da un lato da x. Pertanto nessun if è valido.

    Spero di essermi spiegato bene.

    Ciao!

  5. #5
    La mia mappa è diversa e non intacca in questo problema... credo che sia risolvibile facendo così:

    codice:
       public static void mazeTraversal (int rig, int col)
    	{
    		matrice[rig][col] = 'x';
    		//print();
          System.out.println(rig + " - "+col);
    		
    		if (rig == 4 && col == 11)
    		{
    			return;
    		}		
    		
    		if (matrice[rig][col + 1] == '.')
    			mazeTraversal (rig, col + 1);
    		
    		else if (matrice[rig + 1][col] == '.')
    			mazeTraversal (rig + 1, col);
    		
    		else if (matrice[rig][col - 1] == '.')
    			mazeTraversal (rig, col - 1);
    			
    		else if (matrice[rig - 1][col] == '.')
    			mazeTraversal (rig - 1, col);
    	
    
            	else if (matrice[rig][col + 1] == 'x')
    			mazeTraversal (rig, col + 1);
    		
    		else if (matrice[rig + 1][col] == 'x')
    			mazeTraversal (rig + 1, col);
    		
    		else if (matrice[rig][col - 1] == 'x')
    			mazeTraversal (rig, col - 1);
    			
    		else if (matrice[rig - 1][col] == 'x')
    			mazeTraversal (rig - 1, col);
    	}
    Prova

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.