Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 2, 9 CFU => Topic started by: leovinci on 18-10-2012, 09:25:20



Title: aiuto errore metodo ricorsivo stampa albero x livelli
Post by: leovinci on 18-10-2012, 09:25:20
qualcuno ha provato a fare il metodo ricorsivo per stampare l'albero a livelli, io ci stavo provando e stavo riusando quello degli anni precedenti, il problema è che dispone di 2 metodi e stavo cercando di farlo in un unico metodo dato che al prof. Bella non piace su 2, ma mi dà errore in esecuzione di stackoverflow, dove sbaglio? posto il codice dove il primo è quello su 2 metodi mentre il secondo è quello che cerco di fare in un metodo

Code:
public void stampaAlbero()
{
    nodoAlberoBst p = radice; 
    if(p!=null)
        stampaAlbero(p,0);
    else
        System.out.println("albero vuoto");
}
       
public void stampaAlbero(nodoAlberoBst subroot, int livelloAttuale)
{
    if(subroot == null)
        return;
    stampaAlbero(subroot.getDestro(),livelloAttuale+1);

    for(int liv = livelloAttuale ; liv > 0 ; liv--)
        System.out.print("\t");
    System.out.println(subroot.getEtichetta());

    stampaAlbero(subroot.getSinistro(),livelloAttuale+1);
}
 
public void stampaAlberoLivelli(nodoAlberoBst sottoradice, int livelloAttuale)
{
    nodoAlberoBst p=radice;
    if(p!=null) stampaAlberoLivelli(p,0);
    else System.out.println("L'albero è vuoto");

    if(sottoradice==null)
        return;
    stampaAlberoLivelli(sottoradice.getDestro(),livelloAttuale+1);

    for(int liv=livelloAttuale; liv>0; liv--)
        System.out.print("\t");

    System.out.println(sottoradice.getEtichetta());
    stampaAlberoLivelli(sottoradice.getSinistro(),livelloAttuale+1);
                   
}
(EDIT del mod. sistemata indentazione)


Title: Re:aiuto errore metodo ricorsivo stampa albero x livelli
Post by: leovinci on 18-10-2012, 09:25:50
dov'è l'errore? cosa mi sfugge?  :-)|


Title: Re:aiuto errore metodo ricorsivo stampa albero x livelli
Post by: Gpeppe69 on 29-10-2012, 14:32:03
L'errore sta nei parametri tu richiami il metodo passi p però il metodo non prende parametri


Title: Re:aiuto errore metodo ricorsivo stampa albero x livelli
Post by: leovinci on 05-11-2012, 11:15:11
giuseppe69 e quindi come modifico il secondo metodo per farlo funzionare, perchè ho tentato di passare pure p ma non mi funzionava lo stesso


Title: Re:aiuto errore metodo ricorsivo stampa albero x livelli
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 05-11-2012, 11:28:53
Non capisco esattamente cosa è richiesto dall'esercizio.

Non è che hai il testo dato dal professore? (fai copia-incolla esatto in tal caso) Oppure un link alla pagina così leggo io stesso il testo?
.ciaociao


Title: Re:aiuto errore metodo ricorsivo stampa albero x livelli
Post by: leovinci on 06-11-2012, 09:02:10
ciao reversengineer,
in pratica dobbiamo creare un metodo ricorsivo per stampare l'albero a livelli, senza usare struttura dati
ausiliaria. Il primo metodo con 2 funzioni è apposto, ma il prof. vuole che sia un unico metodo, quì
sto avendo problemi e non capisco dove sbaglio  :[Emoticon] PC Asd:


Title: Re:aiuto errore metodo ricorsivo stampa albero x livelli
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 06-11-2012, 16:31:38
Giust per capirci, bisogna emettere in output prima la chiave della radice, poi le chiavi dei due nodi figli della radice, poi le chiavi dei nodi figli dei figli della radice, ecc... e così via. Ho capito bene?.penso

È questo che si intende con visita a livelli?


Title: Re:aiuto errore metodo ricorsivo stampa albero x livelli
Post by: leovinci on 06-11-2012, 22:30:56
si esatto  .leggo


Title: Re:aiuto errore metodo ricorsivo stampa albero x livelli
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 07-11-2012, 12:13:35
Questa istruzione:
Code:
    if(p!=null) stampaAlberoLivelli(p,0);
Essendo che p è lo stesso valore diverso dal null che viene passato al metodo, viene eseguita passando per p un valore diverso da null, e la successiva chiamata, rieseguirà questo codice identicamente alla precedente, all'infinito.
Non solo c'è overflow dello stack (cosa che, in altri contesti, sarebbe anche lecita, ...), ma questo avviene perché si è sbagliata la logica di chiamata ricorsiva.