Ricorsione liste

di il
2 risposte

Ricorsione liste

Salve ragazzi devo fare un algoritmo ricorsivo che mi prenda l'elemento massimo di una lista.Io l'ho scritto in questo modo
struct elementi *massimo(struct elementi *top){
    struct elementi *res=NULL;
    if(top->next==NULL)
   res=top;
    else{
if(top->next!=NULL)
    res=massimo(top->next);
if(res->x<top->x)
    res=top->x;
    }
return res;
}
Il mio problema è che sono sincero ho copiato questo algoritmo da un'altro che selezionava il massimo di un'array.volevo sapere se qualcuno poteva anche spiegarmi dettagliatamente cosa accade,ad esempio io non capisco cosa accade in questa chaimata di funzione :res=massimo(top->next); cioè res prende i valori a 1 ad 1 e li controlla con quello successivo o assume prima l'ultimo valore rispettando il caso base e poi controlla con quelli successivi.Spero di essere stato abbastanza chiaro

2 Risposte

  • Re: Ricorsione liste

    Nell'implementazione di una funzione ricorsiva, in generale ci sono 3 situazioni da prendere in considerazione:

    1) fase di inizializzazione
    2) base della ricorsione
    3) passo ricorsivo.

    Una funzione ricorsiva che processa una struttura dati e', ovviamente, facilmente implementabile quando la struttura e' definibile in modo ricorsivo.
    Ed anche una struttura dati definita in modo ricorsivo, deve prendere in considerazione almeno 2 situazioni distinte:

    1) la base della ricorsione
    2) la definizione ricorsiva.

    Ora il tutto si risolve capendo come funzionano questi 2/3 passi.

    Un modo per capire puntualmente come fare il tutto e' quello di ricordarsi l'enunciato del principio di induzione, un super classico esempio (praticamente la base) di definizione ricorsiva:

    P(0) e' vera [base del principio di induzione]

    se P(n) e' vero implica che P(n+1) e' vero, allora P(x) e' vero per ogni x intero >= 0
    [passo ricorsivo in avanti: n -> n+1]

    Qui' c'e' un trucco: invece di andare in avanti (n -> n+1) si puo' riformulare la definizione all'indietro:
    ( n-1 -> n)

    se P(n-1) e' vero implica che P(n) e' vero, allora P(x) e' vero per ogni x intero >= 0
    [passo ricorsivo all'indietro n-1 -> n]

    Ora, devi per prima cosa definire la lista in modo ricorsivo. Abbastanza ragionevolmente n puo' essere identificato come la lunghezza della lista. Quindi

    P(0) che cosa e' una lista di lunghezza 0?

    P(n) -> P(n+1) come e' fatta una lista di lunghezza n+1 quando si conosce la struttura di una lista di lunghezza n?

    OPPURE

    P(n-1) -> P(n) come e' fatta una lista di lunghezza n quando si conosce la struttura di una lista di lunghezza n-1?

    Una volta capito questo, l'algoritmo ricorsivo per la ricerca del massimo e' semplicemente una variante dell'applicazione del principio di induzione.
  • Re: Ricorsione liste

    Ciao grazie tante per la risposta ,però io volevo capire per ogni chiamata di funzione cosa accadeva,perchè non capisco cosa fa l'esecutore :S
Devi accedere o registrarti per scrivere nel forum
2 risposte