|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
[C++] Trasformare una funzione ricorsiva in qualcos'altro?
Salve a tutti.
Qualcuno sa dirmi come posso trasformare una funzione ricorsiva in una funzione non ricorsiva? Chiedo questa cosa perchè vorrei avere una funzione non ricorsiva che si occupi di scansionare un vector di elementi, multilivello. Il codice attuale è questo: Codice:
void addraw(cubo temp) { //se non ci sono sottocubi if (temp.lista_sottocubi.size() == 0) { if (temp.livello == LMAXI) { double centro[3]={(temp.V[6].x)/2, (temp.V[6].y)/2,(temp.V[6].z)/2}; //salvataggio centro e lato } } //se i sottocubi ci sono else { for (int i=0;i<(int)temp.lista_sottocubi.size();i++){ addraw(temp.lista_sottocubi[i]); } } }
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Risposta banale: usando uno stack per tenere traccia degli elementi intermedi che ti servono.
Poi magari possono esserci soluzioni migliori (più efficientii) in base all'algoritmo da implementare. Vedi la classica implementazione del fattoriale, ad esempio. Comunque io preferisco nettamente l'eleganza tipica delle soluzioni ricorsive.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
A me mi crea problemi per disegnare il contenuto di quell'oggetto con OpenGL, e quindi volevo provare usando una funzione non ricorsiva...
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Prova con uno stack allora, ma guardando il codice mi sorge il dubbio che la funzione che hai scritto sia inefficiente perché non passi un puntatore o reference (meglio!) all'oggetto (o struttura) cubo, ma ogni volta ne fai una copia intera. Per cui non risolveresti molto passando a una funzione non ricorsiva.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
Ti ringrazio anticipatamente per la disponibilità
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Come ti è suggerito dovresti passare alla funzione il puntatore invece dell'intera struttura, la firma della funzione diventerebbe questa:
void addraw(cubo *temp)Naturalmente per accedere ai campi di temp dovrai usare l'operatore -> invece del punto. |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
la domanda è: questo tipo di riferimento, cambia le performance della funzione? Oppure in pratica, non cambia niente? Mi rendo conto che non creare una copia, ma passare il puntatore al riferimento, ottimizza l'uso della memoria, ma i tempi di "calcolo" secondo voi sono migliori?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Oltre a ridurre la quantità di memoria utilizzata elimini anche il tempo necessario per copiare le strutture; d'altra parte si introduce un leggero ritardo nell'accesso ai campi poiché i puntatori vanno dereferenziati, però i compilatori creano codice ottimizzato per ridurre al minimo queste operazioni, in sostanza dovresti apprezzare un incremento significativo delle prestazioni.
Una soluzione iterativa sarebbe comunque più efficiente, ma richiederebbe un maggiore sforzo nella progettazione. |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Visto che usi il C++, utilizza i reference (& al posto di * nella firma della funzione), che è meglio. In questo modo puoi continuare a usare anche il . anziché -> per accedere ai campi della struttura.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Perfetto, grazie a tutti.
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:52.