|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jun 2008
Messaggi: 40
|
[c++ / Torre di Hanoi] - Come si risolve iterativamente?
Ciao a tutti,
sono alle prese con la torre di Hanoi. Dati il numero degli anelli, la torre iniziale, la torre finale, la torre "di servizio" sono riusciuto a far girare il programma con una funzione ricorsiva in modo che dia tutte le istruzioni (es. da 1 a 3 vuole dire muovi un anello dalla torre 1 alla torre 3) per risolvere correttamente il problema. Siccome ogni problema risolto adottando una funzione ricorsiva può anche essere risolto con una funzione iterativa, è un pò che cerco di capire come riscrivere la mia funzione void hanoi(int, int, int, int) senza far uso della ricorsione. Ma niente, niente, niente! ![]() Grazie anticipatamente dell'aiuto. Di seguito il programma con la funzione ricorsiva. Codice:
// Esercizio 642.cpp : definisce il punto di ingresso dell'applicazione console. // #include "stdafx.h" #include <iostream> using std::cout; using std::endl; using std::cin; int _tmain(int argc, _TCHAR* argv[]) { return 0; } void hanoi(int, int, int, int); int main() { int number; int piniziale; int pfinale; int ptemp; cout << "Inserisci il numero di anelli da spostare: "; cin >> number; cout << "\n\nInserisci il numero della torre iniziale: "; cin >> piniziale; cout << "\n\nInserisci il numero della torre finale: "; cin >> pfinale; cout << "\n\nInserisci il numero della torre temporanea: "; cin >> ptemp; hanoi(number, piniziale, pfinale, ptemp); return 0; } void hanoi(int number, int piniziale, int pfinale, int ptemp) { if (number == 1) { cout << "da " << piniziale << " a " << pfinale << endl; return; } else { int ttemp = pfinale; int ttemp2 = piniziale; int ttemp3 = ptemp; int ttemp4 = piniziale; int ttemp5 = pfinale; int ttemp6 = ptemp; hanoi(number - 1, ttemp2, ttemp3, ttemp); cout << "da " << piniziale << " a " << pfinale << endl; hanoi(number - 1, ttemp6, ttemp5, ttemp4); return; } } |
![]() |
![]() |
![]() |
#2 | |
Member
Iscritto dal: Apr 2007
Messaggi: 263
|
Da wikipedia(en):
Quote:
|
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Jun 2008
Messaggi: 40
|
Il realtà il passaggio creda voglia dire che per avere una funzione iterativa equivalente ad una ricorsiva va analizzato lo stack.
Però sono sempre in panne ... non riesco a definire per bene l'iterazione! Grazie lo stesso per l'aiuto! |
![]() |
![]() |
![]() |
#4 | |
Member
Iscritto dal: Jun 2008
Messaggi: 40
|
Ho trovato un interessante spiegazione in merito qui:
http://www.eleves.ens.fr/home/defeo/.../iterative.htm Mi è quasi tutto chiaro, ma non riesco a capire questo passaggio: Quote:
Grazie per l'aiuto! Ultima modifica di unslee : 20-07-2008 alle 18:36. |
|
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Jun 2008
Messaggi: 40
|
Niente ...
Ho fatto un'analisi credo abbastanza precisa della procedura iterativa di cui al link. A parte il simbolo di cui al post precedente che non conosco. Non mi trovo su un postulato che nel link viene fatto. Tornando a monte, seguendo la procedura del link, ho provato ad analizzare la questione come segue: a) Abbiamo bisogno di quattro variabili e cioè: numero di dischi, piolo iniziale, piolo finale, piolo d'appoggio. b) Definiamo le mosse quante sono: Codice:
while (int counter = numeroDischi; counter >= 3; counter --) { int mosse = 6; mosse = mosse * 2 + 1 } c) Do in pasto alla funzione calcoloDisco(Mosse), come specificato nel link, il numero di mosse e mi viene restituita man mano l'indicazione di quale anello muovere (1 per l'anello più piccolo, 2 per quello più grande, 3 per quello più grande ancora e così via. A questo punto so esattamente quale anello devo muovere per ogni mossa ma dovrei capire (da quale piolo) a quale piolo muoverlo. Ora leggo nel link: Quote:
![]() Please ..................help! |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Sep 2000
Messaggi: 886
|
# = "numero"?
__________________
1986/2008 - 22 anni di rabbia cancellati in un giorno. Adesso passeranno altri 22 anni.. ![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Se proprio non ne vieni fuori vuoi un po' di documentazione rpova a guardare in questo sito: trovi più di cento implementazioni (in diversi linguaggi) del problema della torre di Hanoi.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#8 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Nel sito indicato da banryu79, la versione cpp utilizza uno stack esplicito per implementare l'algoritmo iterativamente. Proprio quello che stavi cercando
![]() |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Jun 2008
Messaggi: 40
|
Ciao a tutti!
In realtà il programma indicato da banryu79 è ancora troppo complesso per me. Ci sono molto cose che non ho studiato ancora ![]() Mi conservo il link. Magari andando avanti con lo studio più in là sarò capace di capirlo appieno. Grazie mille a tutti per l'aiuto e la disponibilità! |
![]() |
![]() |
![]() |
#10 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
La tecnica utilizzata in quel file è quella che si utilizza proprio per trasformare una funzione da ricorsiva a iterativa. Si utilizza, cioè, uno stack esplicito. Nelle versioni iterative, viene utilizzato lo stack(implicito) di sistema per memorizzare le variabili e il valore di ritorno tra una chiamata e l'altra della funzione. Nel caso in esame, l'utilizzo di uno stack esplicito è l'unico modo per risolvere il problema. Nei casi in cui la chiamata ricorsiva è soltanto nell'ultima riga della funzione, è possibile utilizzare semplicemente un ciclo(while o for). Trovi maggiori dettagli, con un esempio di conversione(funzione di attraversamento degli alberi binari), in questo libro: http://www.amazon.com/Algorithms-Par.../dp/0201314525 Dello stesso autore, c'è anche la versione per C++(in italiano). Ultima modifica di Vincenzo1968 : 22-07-2008 alle 00:03. |
|
![]() |
![]() |
![]() |
#11 |
Junior Member
Iscritto dal: Feb 2006
Messaggi: 21
|
A questa URL trovi due versioni iterative e la prima mi sembra affrontabile...
![]() (AUSGABE è l'output, credo significhi che puoi scegliere se stampare o meno a video...)
__________________
"Computer Science is no more about computers than astronomy is about telescopes" (Edsger Dijkstra) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:42.