Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    12

    [C] - Visualizzare una stringa al contrario usando la Ricorsione

    Ciao ragazzi, sto cercando di imparare questa dannata ricorsione e ho trovato quest'esercizio che mi sta dando un pò di problemi:
    Scrivere una funzione ricorsiva che riceva come argomento un vettore di caratteri,e lo visualizzi al contrario !
    Suggerimenti?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Cosa hai scritto?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    codice:
    void printReverse(int length, char *string) {
      if(length==0)
        return;
      printf("%c", string[length-1]);
      printReverse(length-1, string);
    }
    
    //printReverse(strlen(string), string);
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    12
    Originariamente inviato da Scara95
    codice:
    void printReverse(int length, char *string) {
      if(length==0)
        return;
      printf("%c", string[length-1]);
      printReverse(length-1, string);
    }
    
    //printReverse(strlen(string), string);
    Sei un grande c***o, come al solito non ti smentisci mai ! Sai dove posso trovare qualche dispensa fatta bene sulla ricorsione? E' da pochissimo che la sto studiando e ho molti problemi... Cioè ad esempio ho appena testato il codice e naturalmente funziona alla grande però non mi spiego questo:

    Per esempio prendiamo in considerazione la parola "ciao";

    Se la lunghezza è == 0 restituisci NULL altrimenti stampa il vettore[lenght-1] vale a dire in questo caso sposta il carattere "o" di ciao in prima posizione.
    Ora con printReverse(length-1, string) suppongo a questo punto che la lunghezza del vettore andrà a dimunire a -2 , -3 fino a -4 restituendo così la parola inversa... Non riesco a capire questo passaggio in quanto cmq è come se ci fosse un ciclo ,anche se non è presente...

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Se vuoi capire bene la ricorsione ti consiglio di staccarti dal linguaggio C, potresti leggere The Little Schemer...
    È una spiegazione molto completa della ricorsione che nel contempo introduce scheme, tuttavia scheme non viene introdotto come linguaggio, ma come veicolo per la spiegazione della ricorsione...

    Per quanto riguarda il codice, length all'inizio è la lunghezza della stringa, e non zero!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Semplicemente richiami iterativamente la funzione PrintReverse, passando ogni volta un carattere in meno. Una volta che la lunghezza della stringa sarà ridotta a 0, uscirai dalla funzione e la stampa sarà finita.
    Prova a fare la stessa cosa per la stampa "normale" di una stringa, magari ti sarà più chiaro.

  7. #7
    Giusto per vedere un'implementazione alternativa:
    codice:
    void reverseprint(const char * str)
    {
        if(*str)
        {
            reverseprint(str+1);
            putchar(*str);
        }
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    12
    Scara95
    lo comprerò sicuramente ! Grazie ancora e grazie a tutti per le altre risposte ,siete stati gentilissimi e completi !

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Originariamente inviato da MItaly
    Giusto per vedere un'implementazione alternativa:
    codice:
    void reverseprint(const char * str)
    {
        if(*str)
        {
            reverseprint(str+1);
            putchar(*str);
        }
    }
    Sì, hai ragione, infatti era la prima implementazione che avevo pensato, ma ormai, al di fuori di Haskell, escludo automaticamente ciò che non è tail recursive ^^'

    Prego, non c'è di che, intanto comunque assicurati di capire questi spezzoni di codice!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Originariamente inviato da Scara95
    Sì, hai ragione, infatti era la prima implementazione che avevo pensato, ma ormai, al di fuori di Haskell, escludo automaticamente ciò che non è tail recursive ^^'
    E in effetti ha senso farlo anche in C, dato che praticamente ogni compilatore implementa l'ottimizzazione per la tail recursion (evitando di creare stack frame ulteriori).
    Amaro C++, il gusto pieno dell'undefined behavior.

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.