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

    [C++] funzione ricorsiva

    d nuovo ciao a tutti
    sono ancora alle prese con sti programmini universitari del cacchio, che per un noobbo d c++ come me, sono abbastanza contorti.
    Ecco a voi il problema!

    Dev-C++ v 4.9.8.0

    codice:
    #include<iostream>
    using namespace std;
    char ch;
    void reverse_line()
    {
    while(cin>>ch)
    {
    reverse_line();
    cout<<ch<<endl;
    }
    }
    main()
    {reverse_line();
    system("pause");
    return 0;
    }

    ho letto anche qualcosa sulle funzioni ricorsive, ma gli esempi riportati nei tutorial o guide che fin ora ho consultato in internet, nn sono così "BASTARDI"

    cmq tornando al mio problema: qualcuno sa spiegarmi perchè l'output è "AAAAA"???

    N B : l'esercizio prevede come input: "PALLA"
    poi INVIO, CTRL+Z, INVIO e l'output sarà "AAAAA"

    grazie 1 casino in anticipo!!!
    saluti

  2. #2
    codice:
    #include<iostream>
    using namespace std;
    string str;
    void reverse_line(int pos)
    {
    	if(pos < str.length())
    		reverse_line(pos+1);
    	cout<<str[pos];
    	
    }
    int main()
    {
    	cin >> str;
    	reverse_line(0);
    	cout<<"\n";
        system("pause");
    	return 0;
    }
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    noob è un termine che ho sentito parecchio a Runescape

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    35
    grazie per la risposta unomichisiada, ma purtroppo non mi serve un programma simile, anche se fa le stesse cose, a me serve solo capire quello che ho postato.

    cmq grazie

  5. #5
    Originariamente inviato da folk3n
    grazie per la risposta unomichisiada, ma purtroppo non mi serve un programma simile, anche se fa le stesse cose, a me serve solo capire quello che ho postato.

    cmq grazie
    Beh quello che hai postato non funziona,poi se lo vuoi capire lo stesso...
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    35
    t garantisco che funziona esattamente come da descrizione, magari sbagli nell'inserire l'input.

    chiarisco meglio, lanci il programmino, scrivi "palla" poi dai INVIO , CTRL+Z e ancora INVIO. vedrai la scritta in verticale "aaaaa"

  7. #7

    Re: [C++] funzione ricorsiva

    Ok non avevo notato il CTRL + Z e ti avevo liquidato troppo in fretta devo ammettere... Penso che il comportamento sia dovuto a qualche influenza che questa sequenza di controllo ha sullo stack del programma.Da dove l'hai tratto?Se hai documentazione a riguardo postala.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  8. #8
    Utente di HTML.it L'avatar di dannie
    Registrato dal
    Aug 2005
    Messaggi
    336
    Scusate, non potrebbe essere così qualcosa tipo:
    - ch è variabile globale e quindi viene ripetutamente sovrascritta
    - parte il main che richiama reverse_line()
    - viene letta p quindi ch vale "p": non è ctrl+z quindi viene richiamata reverse_line()
    - viene letta a quindi ch vale "a": non è ctrl+z quindi viene richiamata reverse_line()
    - viene letta l quindi ch vale "l": non è ctrl+z quindi viene richiamata reverse_line()
    - viene letta l quindi ch vale "l": non è ctrl+z quindi viene richiamata reverse_line()
    - viene letta a quindi ch vale "a": non è ctrl+z quindi viene richiamata reverse_line()
    - viene inserito ctrl+z quindi ch resta "a" e la prima reverse_line() termina
    - la "precedente reverse_line()" (quella che aveva letto a) stampa ch (cioè "a") e un a capo
    - la "precedente reverse_line()" (quella che aveva letto l) stampa ch (cioè "a") e un a capo
    - la "precedente reverse_line()" (quella che aveva letto l) stampa ch (cioè "a") e un a capo
    - la "precedente reverse_line()" (quella che aveva letto a) stampa ch (cioè "a") e un a capo
    - la "precedente reverse_line()" (quella che aveva letto p) stampa ch (cioè "a") e un a capo
    ...? Solo che mi sarei aspettata venissero letti anche gli invio quindi mi sa che manca ancora qualcosa....
    EDIT: rileggendo meglio gli ultimi post: la parola viene messa subito per intera, quindi probabilmente la sequenza finale serve solo epr fargli leggere prima la parola e poi il ctrl+z...?

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Come saprai, le funzioni ricorsive sono fortemente legate al concetto di stack.

    Se le variabili che usi tra una chiamata ricorsiva e l'altra non sono contenute nello stack, allora perdi il beneficio di tale tecnica e incorri in malfunzionamenti.

    Nel tuo caso, la dichiarazione della variabile ch deve essere all'interno della funzione ricorsiva e non globale (correzione in neretto). In quest'ultimo caso, infatti, la variabile e' una sola e viene necessariamente sovrascritta tra una chiamata e l'altra. Solo se dichiarata nello stack, "sopravvive" in tante copie quante sono le chiamate e cio' ti consente di far funzionare il programma.

    Sicuramente ti renderai conto subito che era una "stupidaggine", ma e' da questo tipo di dettagli che un professore puo' basare il suo giudizio sulla tua reale comprensione della ricorsivita' ...

    codice:
    #include <iostream>
    
    using namespace std;
    
    void reverse_line()
    {
      char ch; 
      while(cin>>ch)
      {
        reverse_line();
        cout<<ch<<endl;
      }
    }
    
    int main()
    {
       reverse_line();
       system("pause");
       return 0;
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    35
    ok grazie a tutti, mi siete veramente stati di grande aiuto!!!

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.