Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1
    Utente di HTML.it L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453

    [C++] funzione void ricorsiva: come funziona?

    ciao a tutti...

    c'è un'anima pia che puo' aiutarmi a capire come funziona la ricorsione nel caso di questa, e in generale, nelle funzioni void?

    Ho capito il meccanismo delle istanze che si aprono e si chiudono a ritroso nel caso di funzioni in cui le varie istanze restituiscono un valore all'istanza precedente...

    Però nel caso di void... prendiamo questo programma

    codice:
    #include<iostream>
    #include<cstdlib>
    /* Fare una funzione ricorsiva che, dato un numero n, stampa tutti i numeri da 1 a n*/
    using namespace std;
    
    void stampa_numero(int n)
    {
         if (n==1)
             cout<<n<<endl;
         else
         {
             stampa_numero(n-1);
             cout<<n<<endl;
         }
    }
    
    int main()
    {
        int numero(0); 
        cout<<"Inserisci il numero n:";
        cin>>numero;
        stampa_numero(numero);
        
        system("PAUSE");    
        return 0;
    }
    potete spiegarmi in che modo, una volta che arrivo all'istanza in cui n vale 1 (e stampo dunque 1 a video senza continuare la ricorsione) vengono chiuse via via anche le altre istanze? Non mi è molto chiaro...

    grazie!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Intanto semplificherei la funzione così

    codice:
    void stampa_numero(int n)
    {
       if(n>1) stampa_numero(n-1);
    
       cout<<n<<endl;
    }
    In secondo luogo non userei il termine "istanza" perche' non mi sembra adatto al contesto ...

    Infine, non c'e' molta differenza tra le funzioni void ricorsive e quelle che restituiscono un valore ... in realta' la cosa principale da tenere presente e' il funzionamento dello stack del processore ...

    Hai "ben" presente il funzionamento dello stack della CPU?

  3. #3
    Utente di HTML.it L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453
    ok, la semplificazione mi torna, l'avevo scritta così per evidenziare il caso di terminazione... meglio prima capire e poi dedicarsi allo stile

    perchè non è appropriato parlare di istanze? Io so che ogni volta che si esegue una funzione (e quindi anche nella ricorsione) si apre un'istanza diversa...

    Riguardo allo stack del processore, sinceramente non so cosa sia...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Kilin
    perchè non è appropriato parlare di istanze? Io so che ogni volta che si esegue una funzione (e quindi anche nella ricorsione) si apre un'istanza diversa...
    Una "istanza" e' una copia di qualcosa usato come modello (un oggetto e' una istanza di una classe) ... non puoi parlare di istanze di funzioni ...

    Dove hai sentito o letto questo termine nel contesto dell'esecuzione di funzioni?

    Riguardo allo stack del processore, sinceramente non so cosa sia...
    Questo e' un problema, perche' se tu conoscessi questo argomento, capiresti immediatamente il funzionamento delle funzioni ricorsive ...

    E in realta', non conosco corso di studi (universitario e non) in cui si parli delle funzioni ricorsive senza aver parlato di stack della CPU ...

  5. #5
    Utente di HTML.it L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453
    prima di tutto, si parla eccome di istanza di una funzione... E anzi, credo che sia esattamente il termine più appropriato... In questi termini si è espresso sia il mio professore di informatica (faccio ingegneria informatica a pisa) sia il libro di testo, che dice, ad esempio:

    [...]Conseguentemente, ogni esecuzione di una stessa funzione (ISTANZA della funzione) da luogo ad una nuova copia degli argomenti formali e delle variabili locali (che nascono e muoiono con l'inizio e la fine dell'esecuzione della funzione stessa) [...] Questo concetto tornerà particolarmente utile nel caso di funzioni ricorsive
    (che torna anche in quanto "copia di un modello", il concetto che dicevi tu)

    Riguardo allo stack del processore, non so perchè non ce ne abbiano parlato, magari l'argomento verrà affrontato in un altro corso più specifico, dato che in questo si parla solo di c++...

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Kilin
    (che torna anche in quanto "copia di un modello", il concetto che dicevi tu)
    Sì ... d'accordo ... ma, secondo me, e' usata per riferirsi "all'istanza dei dati locali" ... in questo caso va bene ...

    Riguardo allo stack del processore, non so perchè non ce ne abbiano parlato, magari l'argomento verrà affrontato in un altro corso più specifico, dato che in questo si parla solo di c++...
    Beh, e' importante per capire "dove sono" i dati locali di ogni "istanza" e comprendre la sequenza di esecuzione delle varie parti di codice tra una chiamata e l'altra della funzione ricorsiva ...

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Comunque si dice che l'iterazione è sempre preferibile alla ricorsione
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  8. #8
    Utente di HTML.it L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453
    lo so! però ora che stiamo facendo le funzioni ricorsive all'uni ci fanno fare questi prog, che hanno un'equivalente ricorsivo più efficiente e meno dispendioso in termini di memoria, ma dobbiamo usare la ricorsione per imparare..

  9. #9
    Utente di HTML.it L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453
    Originariamente inviato da oregon
    Beh, e' importante per capire "dove sono" i dati locali di ogni "istanza" e comprendre la sequenza di esecuzione delle varie parti di codice tra una chiamata e l'altra della funzione ricorsiva ...
    ad ogni modo, non è che puoi farmi capire più o meno il concetto? ho cercato info riguardo alla stack della cpu, ma è difficile non avendo idea di dove andare a parare...

    grazie..

  10. #10
    Originariamente inviato da Kilin
    ad ogni modo, non è che puoi farmi capire più o meno il concetto? ho cercato info riguardo alla stack della cpu, ma è difficile non avendo idea di dove andare a parare...

    grazie..
    http://it.wikipedia.org/wiki/LIFO

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.