Wednesday, January 05, 2011

Scambio di due variabili senza la variabile di appoggio

Il metodo classico per lo scambio di due variabili, denotiamole con a e b, prevede l'utilizzo di una terza variabile di appoggio, chiamiamola c, e consiste, sostanzialmente, nell'eseguire in successione le seguenti assegnazioni:

c = a
a = b
b = c

In questo topic, sarà mostrato un metodo alternativo che effettuerà il suddetto scambio senza l'utilizzo della terza variable di appoggio c.
L'idea di tale metodo per variabili numeriche è da attribuirsi al caro amico Giovanni Valentino ed è stato poi, successivamente, da me esteso al caso alfanumerico. Nel prosieguo, quindi, distingueremo i due casi analizzandoli separatamente.

Caso numerico
Dette a e b le variabili numeriche da scambiare, possiamo effettuare lo scambio effettuando in successione le seguenti operazioni:

a = a + b
b = a - b
a = a - b

Come si potrà verificare, tale metodo funziona correttamente per qualsiasi valore numerico che si attribuisce alle variabili a e b.
Passiamo quindi ad esaminare il caso alfanumerico.

Caso alfanumerico
Per esaminare tale caso, al fine di aumentare la chiarezza espositiva e la comprensione in termini pratici dello stesso, faremo riferimento alla sintassi di uno specifico linguaggio di programmazione, sebbene il procedimento possa essere applicato utilizzando qualsiasi altro linguaggio.
Per quanto detto, la sintassi che utilizzeremo è quella del linguaggio Java.
Le operazioni da eseguire, ricalcano le orme del caso numerico e si discostano da questo solo per alcuni dettagli.
Più precisamente, dette a e b le variabili alfanumeriche da scambiare, le operazioni da compiere sono le seguenti:


a = a + b;

// b = a.substring(0, 0 + a.length() - b.length()); Equivale a:
b = a.substring(0, a.length() - b.length());

//a = a.substring(b.length(), b.length() + a.length() - b.length()); Equivale a:
//a = a.substring(b.length(), a.length()); Equivale a:
a = a.substring(b.length());


Anche in questo caso, si potrà facilmente constatare, che il metodo funziona per qualsiasi stringa attribuita alle variabili a e b.

Concludiamo tale topic, osservando che: sebbene il metodo illustrato ottimizza l'utilizzo dello spazio di memoria, esso ha, come rovescio della medaglia, l'aumento del tempo computazionale dovuto alle operazioni che devono essere eseguite.
In definitiva, il suddetto metodo, è equivalente a quello tradizionale e la scelta dell'uno o dell'altro, dipende esclusivamente dal tipo di ottimizzazione che si desidera: più spazio e meno tempo nel caso tradizionale, meno spazio e più tempo per il metodo illustrato. Ovviamente, però, essendo tali ottimizzazioni veramente minime, soprattutto in considerazione della potenza raggiunta dagli attuali computers, la scelta del metodo, in realtà, dipende da fattori dovuti esclusivamente al gusto personale.