Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Dal richiamo di Enrico Letta alla necessità di completare il mercato unico entro il 2028 alla visione di Nokia sul ruolo dell’IA e delle reti intelligenti, il Nokia Innovation Day 2025 ha intrecciato geopolitica e tecnologia, mostrando a Vimercate come la ricerca italiana contribuisca alle sfide globali delle telecomunicazioni
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
OPPO Reno14 F 5G si propone come smartphone di fascia media con caratteristiche equilibrate. Il device monta processore Qualcomm Snapdragon 6 Gen 1, display AMOLED da 6,57 pollici a 120Hz, tripla fotocamera posteriore con sensore principale da 50MP e generosa batteria da 6000mAh con ricarica rapida a 45W. Si posiziona come alternativa accessibile nella gamma Reno14, proponendo un design curato e tutto quello che serve per un uso senza troppe preoccupazioni.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-07-2008, 16:26   #1
unslee
Member
 
L'Avatar di unslee
 
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;
	}
}
unslee è offline   Rispondi citando il messaggio o parte di esso
Old 20-07-2008, 17:42   #2
stdecden
Member
 
L'Avatar di stdecden
 
Iscritto dal: Apr 2007
Messaggi: 263
Da wikipedia(en):

Quote:
Virtually all programming languages in use today allow the direct specification of recursive functions and procedures. When such a function is called, the computer (for most languages on most stack-based architectures) or the language implementation keeps track of the various instances of the function (on many architectures, by using a call stack, although other methods may be used). Conversely, every recursive function can be transformed into an iterative function by using a stack.
Mai fatto, a dire la veritá, ci devo provare un giorno o l'altro. comunque spero di esserti stato utile
stdecden è offline   Rispondi citando il messaggio o parte di esso
Old 20-07-2008, 17:50   #3
unslee
Member
 
L'Avatar di unslee
 
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!
unslee è offline   Rispondi citando il messaggio o parte di esso
Old 20-07-2008, 18:24   #4
unslee
Member
 
L'Avatar di unslee
 
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:
Ci basta sapere quante volte (e in che direzione) ha già mosso il disco in questione per sapere su quale piolo si trovi. Osserviamo che il disco più piccolo muove ogni due mosse (lo si può dimostrare guardando il contatore binario); poiché il disco immediatamente sotto di esso muove la metà delle volte, deve necessariamente muovere ogni quattro mosse. In generale un disco di dimensione d, muove ogni 2d mosse. Quindi, supponendo che i sia il numero d'ordine della mossa, la seguente formula ci dice quante volte ha mosso il disco:

#mosse = i / 2d

C'è bisogno di una piccola correzione a questa formula, perché il primo disco non muove dopo due mosse, ma dopo una; il secondo muove dopo 2, il terzo dopo 4 e così via (anche questo si può dimostrare attraverso il contatore binario). Per cui la formula va aggiustata così:

#mosse = (i + 2d-1) / 2d

che è equivalente a:

#mosse = (i / 2d) + (1 / 2)

A questo punto, sapendo che il disco ha mosso sempre verso (ad esempio) destra e che la torre partiva dal piolo p, possiamo calcolare così il piolo su cui si trova il disco:

piolo = ((#mosse mod 3) + p) mod 3
cosa vuole dire #mosse? Sono alle prime armi con il C++ e per ora il simbolo # l'ho usato solo con include.

Grazie per l'aiuto!

Ultima modifica di unslee : 20-07-2008 alle 18:36.
unslee è offline   Rispondi citando il messaggio o parte di esso
Old 20-07-2008, 19:11   #5
unslee
Member
 
L'Avatar di unslee
 
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
}
nella variabile mosse vado a memorizzare quante mosse sono necessarie.

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:

A questo punto dimostriamo che se l'intera torre va spostata verso destra, i dischi con la stessa parità del disco più grande si muoveranno sempre verso destra, mentre gli altri si muoveranno sempre verso sinistra (nel caso la torre vada spostata verso sinistra, è il contrario).

Io qui non riesco a capire proprio. Simulando l'esercizio con tre anelli disposti sul primo piolo, con due pioli liberi alla destra e torre da ricostruire sull'ultimo piolo a destra, il mio anello più piccolo (1) e anche l'anello intermedio si muovono sia a destra sia a sinistra ...

Please ..................help!
unslee è offline   Rispondi citando il messaggio o parte di esso
Old 20-07-2008, 23:33   #6
atragon
Senior Member
 
L'Avatar di atragon
 
Iscritto dal: Sep 2000
Messaggi: 886
# = "numero"?
__________________

1986/2008 - 22 anni di rabbia cancellati in un giorno. Adesso passeranno altri 22 anni.. Learn Falcon language sul sito ufficiale e sul mio
RIP NBA3D
atragon è offline   Rispondi citando il messaggio o parte di esso
Old 21-07-2008, 11:46   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 21-07-2008, 20:59   #8
Vincenzo1968
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
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 21-07-2008, 21:11   #9
unslee
Member
 
L'Avatar di unslee
 
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à!
unslee è offline   Rispondi citando il messaggio o parte di esso
Old 21-07-2008, 23:47   #10
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da unslee Guarda i messaggi
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à!
Ciao,

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.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 23-07-2008, 13:13   #11
gaxy
Junior Member
 
L'Avatar di gaxy
 
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)
gaxy è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
Destiny Rising: quando un gioco mobile supera il gioco originale Destiny Rising: quando un gioco mobile supera il...
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo Plaud Note Pro convince per qualità e int...
USA: 19enne britannico accusato di 120 a...
iPhone 17 Pro Max e iPhone 17 Pro pronti...
La FIA avrà tolleranza zero nel 2...
Speciale 6 top bestseller Amazon: da 25,...
La super batteria di Panasonic è ...
Google lancia il Chrome del futuro: &egr...
Offerte FRITZ! a partire da 28€: ecco su...
Meta apre gli smart glasses agli svilupp...
La vera bussola digitale per le PMI &egr...
Colpo da 900 milioni: NVIDIA compra CEO ...
Apollo: il laser australiano che abbatte...
Battlefield 6: svelate le modalità...
Steam dice addio ai 32 bit: la fine del ...
LG OLED evo C5 scontati: il meglio della...
Intel e NVIDIA insieme? Le GPU Arc conti...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:42.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v