|
|||||||
|
|
|
![]() |
|
|
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 19: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 01: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: 22:03.




















