Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 25
  1. #11
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Originariamente inviato da rsdpzed
    non sapevo si chiamasse cosi, volevo un nome per "questa cosa" in un post di ieri .
    Questa ottimizzazione credo che esista solo per non caricare lo stack di variabili inutili che poi non verranno usate dai chiamanti (credo che non potrebbe avvenire se i chiamanti in qualche modo utilizzano poi i valori di ritorno e cioè sfruttano davvero il concetto di ricorsione), il che deriva comunque da codice non scritto bene. Con questa premessa sarebbe davvero brutto affidarsi a questa ottimizzazione per controllare un flusso: voto anch'io per il while
    Può avvenire solo se l'ultima istruzione della funzione è una fura chiamata alla funzione stessa.
    Questa è la definizione di tail-recursion
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  2. #12
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Avrebbe senso in Java, ma in C++ se chiami il main ricorsivamente, dove finiscono le variabili che erano sullo stack? Ho provato a farlo con xcode e ovviamente non funziona, viene lanciata un' eccezione da gdb.
    Voto per il while, o eventualmente una execl sull' eseguibile se si usa un sistema UNIX.

  3. #13
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Ogni chiamata della funzione è a se stante, la popolazione dello stack dipende dalle ottimizazioni fatte dal compilatore, non ho detto che sia una situazione in cui sia consigliabile chiamare una funzione ricorsivamente, ma non mi sembra giusto dire che non funziona, non si può fare o che non ha senso, ho già spiegato i motivi.

    Poi se non gli è venuto in mente di usare un while non credo che conosca il significato di funzione ricorsiva.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #14
    Originariamente inviato da Who am I
    Avrebbe senso in Java, ma in C++ se chiami il main ricorsivamente, dove finiscono le variabili che erano sullo stack?
    Anche Java ha lo stack, anche se lo si usa solo per memorizzarci puntatori, per cui non c'è differenza. Il punto è che la tail call optimization funziona appunto se la chiamata è l'ultima istruzione della funzione, per cui le variabili piazzate sullo stack non servono più a nulla, e le loro posizioni in memoria possono essere "riciclate" per la nuova chiamata a funzione. La cosa è descritta meglio qui.
    Originariamente inviato da Scara95
    Vai a dirlo ai linguaggi fuzionali
    In ogni caso non è vero che un main ricorsivo non ha senso:
    [...]
    Lo so cos'è una funzione ricorsiva e so che può essere molto utile nell'implementazione di certi algoritmi.
    Ma il main non dev'essere l'implementazione di un algoritmo: è semplicemente l'entry point del programma da cui vengono lanciate le varie operazioni che lo compongono, e se tutto ciò di cui hai bisogno è di ripeterlo la maniera idiomatica del C++ - e di praticamente ogni altro linguaggio a paradigma imperativo/procedurale - è di usare un loop di qualche genere.
    Che poi in Haskell o in altri linguaggi a paradigma strettamente funzionale si usi sempre la ricorsione al posto dell'iterazione non ha alcuna rilevanza: se scrivi Haskell scrivi secondo un paradigma, se scrivi in C++ segui un altro paradigma; forzare un paradigma nato altrove su linguaggi pensati in per lavorare in altra maniera dà solo origine a brutto codice.

    In ogni caso, il problema, non si pone, dato che lo standard C++ proibisce di richiamare il main all'interno del programma (C++11, §3.6.2 ¶3).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #15
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da MItaly
    Ma il main non dev'essere l'implementazione di un algoritmo: è semplicemente l'entry point del programma da cui vengono lanciate le varie operazioni che lo compongono, e se tutto ciò di cui hai bisogno è di ripeterlo la maniera idiomatica del C++ - e di praticamente ogni altro linguaggio a paradigma imperativo/procedurale - è di usare un loop di qualche genere.
    Che poi in Haskell o in altri linguaggi a paradigma strettamente funzionale si usi sempre la ricorsione al posto dell'iterazione non ha alcuna rilevanza: se scrivi Haskell scrivi secondo un paradigma, se scrivi in C++ segui un altro paradigma; forzare un paradigma nato altrove su linguaggi pensati in per lavorare in altra maniera dà solo origine a brutto codice.

    In ogni caso, il problema, non si pone, dato che lo standard C++ proibisce di richiamare il main all'interno del programma (C++11, §3.6.2 ¶3).
    Concordo lettera per lettera ... il main non si chiama ricorsivamente, punto.

    Per ripetere tutto (o la maggior parte) di un programma si usa un ciclo, da che mondo è mondo ... tutto il resto è accademia (a volte stucchevole ...)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #16
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    Felicissimo di avervi dato spunto per intavolare questa...

    Interessantissima diatriba.. tra titani del c++
    Ma scendendo molto più a terra oserei dire nel fango...
    Io mi trovo ancora con questo do while a non saperlo nè dove nè come mettere all'inizio e alla fine del mio codicillo arrangiato... qualche semidio del c++ mi aiuterebbe per cortesia?
    Grazie mille e la mia ironia è solo per scherzare un po' ci mancherebbe dal non riconoscervi la stima dovuta o grandissimi del c++
    Un saluto ossequioso
    Lo scalzoegnudo del c++

  7. #17
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Originariamente inviato da Scara95
    Vai a dirlo ai linguaggi fuzionali
    In ogni caso non è vero che un main ricorsivo non ha senso:
    Tu hai una funzione che svolge un determinato compito, quando ti serve che quel compito venga svolto chiami quella funzione, quindi alla fine ha un senso logico chiamare la funzione ricorsivamente se alla fine di quella funzione ti serve che venga svolta quell'azione.

    Vedi che molti algoritmi sono molto più semplici da definire ricorsivamente proprio per questo motivo, e sempre per questo i linguaggi funzionali sono più concisi e comprensibili.
    "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. #18
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    pseudo-codice:
    codice:
    do {
    //istruzioni da eseguire
    } while(controllo);
    Basta sostituire...
    controllo è del tipo:
    true -> ciclo infinito
    strcmp(decisione, "si\n") -> confronta con le funzioni (o con i cicli ) se vuoi confrontare le stringhe e non gli indirizzi
    qualsiasi altra cosa con risultato bool.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #19
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725
    Originariamente inviato da Scara95
    pseudo-codice:
    codice:
    do {
    //istruzioni da eseguire
    } while(controllo);
    Basta sostituire...
    controllo è del tipo:
    true -> ciclo infinito
    strcmp(decisione, "si\n") -> confronta con le funzioni (o con i cicli ) se vuoi confrontare le stringhe e non gli indirizzi
    qualsiasi altra cosa con risultato bool.
    Ok grazie scara95 ma io ho proprio problemi nel fare il controllo...

    Ovverosia...

    Non saprei come dire al sistema "quando l'utente preme ad es. x esci dal programma e quando invece preme i ricomincia dall'inizio..."

    Messo questo codice.. basterebbe poi una piccola legenda all'inizio e alla fine del programma in cui con un semplice cout mi ricordo di premere i due tasti per le due rispettive
    azioni.

    Comunque un comando in input lo so come si prende con il cin >> variabile ma non so come
    non farlo richiedere a video...

    voglio dire se lo metto con cin >> azionedaeseguire

    il programma mi si blocca non appena incontra questa riga.. mentre io vorrei che il programma andasse per la sua strada fino al punto in cui premo uno dei due tasti decisi...

    Spero di essere stato chiaro nell'esporti la mia confusione

    Grazie

  10. #20
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Fai un ciclo infinito, leggi il carattere, se ti basta una x o una i, fai il confronto con un if o uno switch e utilizzi
    codice:
    continue; //torna all'inizio del ciclo
    break; //interrompe il ciclo
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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