PDA

View Full Version : [java] strutture collegate lineari : side effect


tux_errante
11-09-2008, 17:56
salve
vorrei capire meglio la differenza tra algoritmi con side effect e gli altri.
In particolare sto studiando come concatenare due liste (uno dei tanti esempi) e ovviamente ci sono diversi modi, il libro presenta l'esempio con SE, senza e ricorsivo con SE, mentre nella classe di prova poi userà soltanto quelli senza side effect.
La mia domanda è questa : posso usare indifferentemente uno dei due tipi di algoritmo con la stessa classe ?
Anche se non credo dato che quelli con SE hanno un tipo restituito mentre gli altri sono void.

scrivo i due algoritmi per maggiore chiarezza :

class Nodolista{
String info;
Nodolista next;
}

public class SequenzaStringhe{
....
// concatena alla lista this la lista l
public void append(SequenzaStringhe l) {
// 1.crea un nodo ausiliario per trattare uniformemente
// il caso in cui l'oggetto di invocazione sia la
// lista vuota
NodoLista a = new NodoLista(null, nodoinit);
// 2.vai fino all'ultimo elemento della lista
NodoLista p = a;
while (p.next != null)
p = p.next;
// 3.copia gli elementi di l in coda a p
NodoLista q = l.nodoinit;
while (q != null) {
p.next = new NodoLista(q.info, null);
p = p.next;
q = q.next;
}
// 4.elimina il nodo ausiliario
nodoinit = a.next;
}

// con side effect
public static Nodolista append(Nodolista p1, Nodolista p2){
if (p1==null) return p2;
else {
Nodolista q=p1;
while (q.next!=null) q=q.next;
q.next=p2;
return p1;
}
}
}

Oceans11
11-09-2008, 18:55
Ad uno di latina non può che rispondere uno di frosinone......:D


I metodi che fanno side effect in sostanza modificano lo stato dell'oggetto di invocazione, mentre i metodi "funzionali" no.

Nell'esempio del metodo append con le liste....
il primo (SE) aggiunge in coda alla lista su cui invochi il metodo

miaLista.append(nuovaLista);

cioè dopo l'invocazione del metodo miaLista avrà attaccata in fondo anche nuovaLista.

il secondo invece semplicemente costruisce una nuova lista (una terza) a partire dalle prime due, e restituisce quella.

tux_errante
12-09-2008, 11:25
grazie per la risposta quasi-compaesano :D

non ho ben capito una cosa, a partire dalla stessa classe cliente, posso usare indifferentemente uno dei due algoritmi ?

Oceans11
12-09-2008, 16:05
A partire da una classe cliente, puoi usare entrambi i metodi, certo!

Ovviamente in modo diverso e ottieni risultati diversi (ricordi??? una lista modificata oppure una lista nuova di zecca)


PS: scusa la domanda, ma mica stai studiando sulle dispense di calvanese, iocchi, demetrescu, nardi????

tux_errante
13-09-2008, 19:25
huahhaha
si!
quelle :D

comunque non era niente di difficile bastava qualche esercizio ;)

studi anche te a roma ?

Oceans11
13-09-2008, 21:53
che soggetti quei quattro!!! :D

a te chi fa lezione?
beh in effetti devo la mia seppur modesta conoscenza di java a calvanese!

cmq no non sto più a roma, mi sono trasferito a siena.

tux_errante
14-09-2008, 23:04
il corso di fondamenti me lo ha fatto il mitico Demetrescu, mentre Tecniche di programmazione il noioso Iocchi :D