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;
}
}
}
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;
}
}
}