Problema ricorsione

di il
5 risposte

Problema ricorsione

Ragazzi ho un problema,io ho un albero e un array in questa funzione ricorsivamente voglio copiare i nodi di questo albero in un array per farlo mi vado a incrementare una variabile i (inizializzata a 0)però non ottengo il risultato sperato qualcuno sa spiegarmi il perchè?da quanto ho capito quella variabile i è come se tornasse indietro è vado a scrivere in celle di memorie dell'array in cui ho gia scritto
void costruisci(struct tree *albero,int a[],int i){
 if(albero!=NULL){
            costruisci(albero->left,a,i+1);
a[i]=albero->x;
costruisci(albero->right,a,i+1);
    }
}

5 Risposte

  • Re: Problema ricorsione

    Perchè dovresti passare il puntatore ad i; altrimenti dopo aver attraversato tutto il ramo sinistro quando riprendi il controllo riparti dal valore di i che avevi all'inizio, quindi quando vai ad attraversare il ramo destro praticamente sovrascriverai gli elementi di sinistra.
  • Re: Problema ricorsione

    L esercizio dice che non posso usare variabili passate per riferimento come posso ovviare a questo problema?vorrei capire bene perchè questa tipologia non capisco come devo muovermi
  • Re: Problema ricorsione

    Non capisci perche' ragione in modo procedurale invece che in modo funzionale.

    La programmazione funzionale e' un paradigma di programmazione abbastanza diverso da quello che si usa di solito.

    In particolare, appunto, nella programmazione funzionale non si usa il concetto di parametro passato per reference, cioe' via puntatore, ma solo per valore.

    E cosa piu' interessante, nella programmazione funzionale, i parametri VENGONO USATI IN ENTRATA, mentre SOLO IL VALORE DI RITORNO DELLA FUNZIONE viene fatto uscire!

    Quindi, a partire da questa logica, il tuo vettore da popolare NON PUO' ESSERE UN PARAMETRO DI INGRESSO, MA DEVE ESSERE IL VALORE DI USCITA della FUNZIONE.

    Conseguenza, tu hai scritto una PROCEDURA e invece ti serve una FUNZIONE.

    Altra considerazione, un po' piu' sofisticata: la programmazione funzionale prevede un utilizzo della memoria, ed in particolare dello heap, abbastanza allegra. Ed e' per questi che sono stati inventati i garbage collectors.

    Se vuoi fare il salto di qualita' nella scrittura di questa FUNZIONE, potresti usare una libreria per il GC. Ma e' mooooolto oltre a quello richiesto dall'esercizio.



    Ancora un aiutino: ti serve sapere anche quale e' il numero di elementi che il vettore ritornato dalla FUNZIONE contiene.

    E con questo, praticamente e' stato risolto l'esercizo. Ti manca solo il codice.

    Una bazzeccola
  • Re: Problema ricorsione

    Grazie tante per la risposta mi hai illuminato hihihi.Volevo chiedere un'altra cosa se io durante una chiamata ricorsiva ogni volta che vado a sinistra o a destra dell'albero incremento una variabile.Quella variabile mi va a dire effettivamente qual'è l'altezza di quel nodo?
  • Re: Problema ricorsione

    Esatto, è quello che originariamente faceva la tua i.
    Ti consiglio di mettere una stampa printf() nella funzione ricorsiva così vedi qual è la sequenza.
Devi accedere o registrarti per scrivere nel forum
5 risposte