Experimentalia

Appunti raminghi

Scambiare due variabili senza appoggio

with 5 comments

Si tratta di un post inutile ma mi tocca scriverlo per potermi scrollare di dosso quella sensazione fredda che ti prende quando un ricordo magico e dimenticato torna a trovarti da sotto le dita quando meno te lo aspetti.

Il problema, risale ai primi anni novanta era semplice nella sua richiesta e suonava più o meno così:

Scambiare due variabili intere usando una terza variabile per contenere temporaneamente il valore di una delle due è banale. Come è possibile scambiare il contenuto delle due variabili senza utilizzarne una terza?

Se volete provare anche voi a risolverlo allora dovreste farlo adesso perché dopo il salto c’è la soluzione.

Lo scrivo in c perché la prima implementazione è stata in c (ma potrebbe essere c++ p java)

int a=7;
int b=9;
a^=b^=a^=b;

ma penso possa essere scritto in qualunque linguaggio, ad esempio in php

$a=7;
$b=18;
$a^=$b^=$a^=$b;

All’epoca la scrittura mi sembrò affascinante, non l’ho scritta io, ovviamente, era un esempio che un mio prof di informatica tirò fuori dal cilindro dopo averci fatto penare per quasi una settimana a trovare una soluzione ad un problema.

Ora la scrivo qui, chissa che non ricordi qualcosa anche a qualcuno di voi.

Avete soluzioni alternative (all’epoca ero riuscito a risolvere il problema usando somme e sottrazioni ma si trattava, ovviamente, di una soluzione meno sintetica). Se a qualcuno interessa …

Written by Eineki

novembre 19, 2008 a 2:36 am

Pubblicato su C, esperimenti, linguaggi, php

Tagged with , , , ,

5 Risposte

Subscribe to comments with RSS.

  1. Sto provando questa cosa ma nn riesco a compilare… mi da errore sulla riga delle uguaglianze…

    Salvio

    novembre 25, 2008 at 20:05 pm

  2. In python non funziona, da sempre errore sulle uguaglianza…

    Salvio

    novembre 25, 2008 at 20:09 pm

  3. @Savio
    Non conosco python e quindi non ti sarò di molto aiuto. Ho provato a fare qualche prova ed a leggere un po’ di documentazione a spasso per la rete (scrivo questo perché potrei, senza volere, scrivere qualche castroneria, avvisa(te)mi nel caso)

    Leggo da dive into python che il linguaggio non supporta le assegnazioni inline e quindi il sistema pare non funzionare per questo preciso motivo.

    Esplicitando le tre istruzioni anche python torna all’ordine, almeno per quel che ho provato:

    a = 9
    b = 4
    a ^= b
    b ^= a
    a ^= b

    scambia le due variabili.

    In python però avete un metodo molto più elegante e chiaro per scambiare tra di loro le due variabili:

    (a, b)=(b, a)

    non ti nascondo che sono invidioso di quest’ultimo costrutto.

    eineki

    novembre 26, 2008 at 3:31 am

  4. A=a+b
    B=a
    A=a-b

    Io ho trovato questa…

    Gianluca

    ottobre 11, 2012 at 10:26 am

  5. Ciao, forse intendevi

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

    perché altrimenti ti trovi in b la somma dei due valori (ed a è zero).

    La soluzione è interessante anche se, teoricamente, oltre a soffrire dei problemi della mia soluzione (impossibile scambiare tra di loro due alias della stessa locazione di memoria) è sensibile ad overflow e cancellazione.

    Eineki

    ottobre 19, 2012 at 20:55 pm


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: