Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [c] ricorsione

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    [c] ricorsione

    ciao,
    ho una curiosità: è possibile fare in modo che le chiamate ricorsive non tornino indietro effetto boomerang ma terminino con l'ultima chiamata a se stessa, e quindi si cancellino tutte le chiamate ricorsive dallo heap?

    cioè questo avviene per l'istruzione return, forse basta usare exit?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quella che hai nominato si chiama, in gergo, ricorsione di coda. Si ha quando l'ultima chiamata ricorsiva è quella che contiene il risultato finale.
    Da un punto di vista puramente "fisico" (guardando, cioè, solo la memoria) questa cosa non accade con la ricorsione: tutte le chiamate generano una copia in memoria della funzione che, quindi, dovrà essere terminata e la terminazione avviene solo quando il calcolo relativo all'espressione ricorsiva termina.

    Ciò di cui hai bisogno, però, si trasforma in ITERAZIONE: un ciclo for (o while) è la risposta alla ricorsione di coda.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    cioè non si può uscire dalla ricorsione vero? perche ad esempio ho notato in questo ciclo che posto(aggiunge i nodi ad un albero) che quando la ricorsione incappa in un p==NULL nella retro-ricorsione non fa altro che ripetere collegamenti già fatti.

    codice:
    struct nodo *crea_nodo(struct nodo *p, int val)
    {
    if(p==NULL){ /*il punto di inserimento è stato reperito */
      /* Creazione del nodo */
      p = (struct nodo *) malloc(sizeof(struct nodo));
      p->inf=val;
      p->alb_sin = NULL;
      p->alb_des = NULL;
    }
    else {
      if(val > p->inf)
        /* visita il sottoalbero destro */
        p->alb_des = crea_nodo(p->alb_des, val);
      else
        if(val < p->inf)
        /* visita il sottoalbero sinistro */
        p->alb_sin = crea_nodo(p->alb_sin, val);
    }
    return(p); /* Ritorna il puntatore alla radice */
    }

  4. #4
    si DEVE uscire dalla ricorsione....
    quando l'ho imparata mi hanno trasmesso questa linea guida per il testo della funzione:

    condizione di uscita dalla ricorsione
    .....operazioni varie

    La condizione di uscita precede tutto il resto.

    Bye!

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    Si certo..ma va! Io intendevo se si poteva uscire dal ciclo prima che ricominci il riciclo! :bubu:

  6. #6
    posta uno pseudocodice `ideale` !!

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    uno pseudocodice ideale...ci provo! :bubu:

    * un po' di cicli in cui la fnz si autorichiama
    * capita la solux per la condix di uscita.
    * non viene restituito alcun valore alla precedente chiamata ricorsiva ma esce dalla funzione

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.