Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di Tallid
    Registrato dal
    Jan 2009
    Messaggi
    76

    esercizio ricorsione c

    chi sa risolvere il seguente quesito?

    Definire una procedura ricorsiva FirstLast che, data una lista semplice di interi, porta in ultima poszione il primo elemento.

    la firma deve essere del tipo lista
    codice:
    lista FirstLast(lista lst)
    grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    prima che il moderatore ti chiuda il thread, mi dici cosa ti viene difficile in questo? cioè hai provato a farlo e non riesci? hai qualche problema?o proprio non ti va di farla da te?

  3. #3
    Utente di HTML.it L'avatar di Tallid
    Registrato dal
    Jan 2009
    Messaggi
    76
    ho provato a farla ...


    codice:
    lista FirstLast(lista l){  
        if(l->next==NULL)return l;
        lista l2=FirstLast(l->next);       
        l2->next=l;      
        l=l2;      
        return l; 
    }

    però non ho idea di come scriverla...avevo provato a ribaltarla : 1->2->3 diventa 3->2->1
    in modo da tentare comunque di spostare il primo elemento in coda ma la funzione che ho scritto fa questo: 3->1->2 con in input la lista 1->2->3

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ti dò un suggerimento, prendi il primo elemento (la testa della lista). Controlla se è l'ultimo (sei già arrivato), in caso contrario chiama lo stesso metodo passando come parametri la lista restante.
    All'ultimo passo ovviamente devi fare l'assegnamento, non so se sono stata chiara

  5. #5
    Utente di HTML.it L'avatar di Tallid
    Registrato dal
    Jan 2009
    Messaggi
    76
    ok giustamente se la lista ha un solo elemento(caso base)questo è anche l'ultimo
    altrimenti richiamo la funzione ma come assegnamento cosa intendi?

  6. #6
    intende dire che quando arrivi a fine lista devi andare a "collegarci" il primo elemento che hai preso e vuoi mettere in quella posizione

    nel fare ciò ricorda che devi aggiornare (nel giusto ordine) anche il puntatore a testa che dovrà puntare a primoElemento->next;
    all that you need:
    http://www.cplusplus.com/reference/clibrary/

  7. #7
    Utente di HTML.it L'avatar di Tallid
    Registrato dal
    Jan 2009
    Messaggi
    76
    non capisco come tenere quel riferimento, sono in una funzione ricorsiva e mi è concesso solo un parametro

  8. #8
    non è necessario che lo tieni
    prima della chiamata alla funzione ricorsiva vera e propria fai un check se la lista è composta da 1 solo elemento (o se è vuota)

    se è vuota non puoi fare nulla, e non richiami la funzione ricorsiva
    se ha un solo elemento è il caso banale e non fai nulla e non richiami la funzione ricorsiva
    se ha più di un elemento, estrai il primo elemento e te lo salvi in un puntatore temp a parte, quindi fai puntare il riferimento head a primoElemento->next e, a seguire e solo a seguire, fai partire la funzione ricorsiva passandogli la lista (puntatore head aggiornato) e il puntatore temp a quello che prima era il primo elemento della lista
    all that you need:
    http://www.cplusplus.com/reference/clibrary/

  9. #9
    Utente di HTML.it L'avatar di Tallid
    Registrato dal
    Jan 2009
    Messaggi
    76
    quindi tu intendi una cosa di questo tipo
    codice:
    lista FirstLast(lista l){
         if(l==NULL)return NULL; //se è vuota non faccio nulla
         if(l->next==NULL)return l;  //se ha 1 elemento ho finito
         else {
               lista temp=l; //salvo il primo elemento
               l=l->next; //sposto il puntatore al successivo   
              //....richiamo la funzione
         }
    }
    ma poi come faccio a concatenare alla fine il primo elemento?

  10. #10
    quando trovi che l'elemento attualmente in esame ha un next == NULL, ci metti
    elementoAttuale->next = temp;
    return;

    e sei apposto. Come noti funziona sia se la lista ha 2 elementi (appena entra nella funzione ricorsiva è già sull'elemento che ha next==NULL in quanto il primo è stato estratto) sia nel caso ne abbia un numero imprecisato X

    if(elementoAttuale->next == NULL) è la tua cosiddetta "condizione di terminazione della ricorsione"

    se l'elemento successivo non è a null
    funzioneRicorsiva(elementoAttuale->next, temp);
    all that you need:
    http://www.cplusplus.com/reference/clibrary/

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 © 2024 vBulletin Solutions, Inc. All rights reserved.