Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    35

    [C++] Spiegazione funzione ricorsica

    Ragazzi sto impazzendo, non riesco a capire come funziona questa funzione ricorsiva... Qualcuno può gentilmente spiegarmelo?



    codice:
    void merge_sort(vector<int>& a, int from, int to)
    {
       if (from == to) return;
       int mid = (from + to) / 2;
       merge_sort(a, from, mid);
       merge_sort(a, mid + 1, to);
       merge(a, from, mid, to);
    }

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [C++] Spiegazione funzione ricorsica

    codice:
    void merge_sort(vector<int>& a, int from, int to)
    {
       /* Immagino che from indichi l'inizio del sottoarray sinistro mentre to la fine di quello 
        * di destra. Quando i due indici si accavallano interrompi la ricorsione.  
        */
       if (from == to) return;
    
       /* Cerca l'elemento che sta a metà del sottoarray, sarà l'elemento pivot */
       int mid = (from + to) / 2;
    
       /* richiama ricorsivamente la funzione sulla prima metà del sottoarray */
       merge_sort(a, from, mid);
    
       /* richiama ricorsivamente la funzione sulla seconda metà del sottoarray */
       merge_sort(a, mid + 1, to);
    
       /* qui è dove i vari sottoarray creati vengono rimessi assieme in modo ordinato */
       merge(a, from, mid, to);
    }
    Graficamente funziona così:


    http://en.wikipedia.org/wiki/Merge_sort
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    35
    Si, ok, ma non riesco a capire come fa la funzione richiamando se stessa a ordinare i due sotto vettori, cioè la funzione richiama se stessa due volte, infatti:

    codice:
    merge_sort(a, from, mid);
    merge_sort(a, mid + 1, to);
    La prima chiamata ordina il primo sottovettore e la seconda il secondo sottovettore, ma in che modo vengono ordinati? Non riesco a raffigurarmelo...

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da ireon
    La prima chiamata ordina il primo sottovettore e la seconda il secondo sottovettore, ma in che modo vengono ordinati? Non riesco a raffigurarmelo...
    Dimentichi la chiamata a merge, è lì il "succo" di tutto...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    35
    Dimentichi la chiamata a merge, è lì il "succo" di tutto...
    Si, ok, però merge funziona solamente se i due sottovettori sono completamente ordinati, quindi merge_sort (a,from,mid) riordina il primo sottovettore, merge_sort(a,mid+1,to) riordina il secondo sottovettore e quando i due sottovettori sono completamente ordinati viene chiamata merge che unisce i due vettore in un unico vettore completamente ordinato...

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da ireon
    Si, ok, però merge funziona solamente se i due sottovettori sono completamente ordinati, quindi merge_sort (a,from,mid) riordina il primo sottovettore, merge_sort(a,mid+1,to) riordina il secondo sottovettore e quando i due sottovettori sono completamente ordinati viene chiamata merge che unisce i due vettore in un unico vettore completamente ordinato...
    Hai letto la pagina di wikipedia che ti ho linkato? C'è questa immagine che mi sembra piuttosto chiara:


    Guarda che la chiamata a merge non è effettuata una volta sola (come credo che invece che tu abbia capito)!
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    35
    In pratica guardando lo schema, inizialmente viene chiamata la ricorsività di merge_sort(a,from,mid) e merge_sort (a,mid+1,to), poi quando il vettore disordinato iniziale è stato scomposto in singoli elementi viene di volta in volta chiamata merge che riscostruisce quindi il vettore ordinato... È così che funziona? Poi però non capisco quando viene verificato il caso base, ovvero from == to, guardando sempre lo schema quand'è che from è uguale a to?

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.