aiuto ho bisogno di una mano per verificare la correttezza alcuni metodi ricorsivi.
Nel seguente codice i metodi getkilometer, getprice e gettime sono definiti sia iterativamente che ricorsivamente, chi mi sa dire si la versione ricorsiva è corretta???
Grazie
codice:
import java.util.Iterator;
class ItineraryStep extends Itinerary implements Iterator<ItineraryStep> {
protected Connection step;
protected Itinerary next;
public ItineraryStep() {
step = null;
next = Itinerary.makeEmpty();
}
public ItineraryStep(Connection step) {
this();
this.step = step;
}
@Override
public boolean hasNext() {
return (next != null && !(next instanceof EmptyItinerary));
}
@Override
public ItineraryStep next() {
ItineraryStep result = null;
if (hasNext()) {
result = (ItineraryStep) next;
}
return result;
}
@Override
public void remove() throws UnsupportedOperationException {
throw new UnsupportedOperationException("remove");
}
public Itinerary add(Connection c) throws InvalidItinerary {
ItineraryStep tratta = this;
if (next instanceof EmptyItinerary && step == null) {
step = c;
} else {
ItineraryStep nextStep = new ItineraryStep(c);
while (hasNext()) {
if (tratta.step != null && tratta.step.to.equalsIgnoreCase(c.to)) {
throw new InvalidItinerary("Città già presente " + c.to);
}
tratta = tratta.next();
}
if (tratta.step != null && !tratta.step.to.equals(c.from)) {
throw new InvalidItinerary("Buco nell'itinerario da " + tratta.step.to + " a " + c.from);
}
tratta.next = nextStep;
}
return this;
}
public float getKilometer() {
float km = 0;
ItineraryStep tratta = this;
km += tratta.step.km;
while (tratta.hasNext()) {
tratta = tratta.next();
km += tratta.step.km;
}
return km;
}
------------------
public float getKilometer() {
if(!this.hasNext()) return this.step.km;
return this.step.km + getKilometer(this.next());
}
public float getKilometer (ItineraryStep i1) {
if(!i1.hasNext()) return i1.step.km;
return i1.step.km + getKilometer(i1.next());
}
------------------
public float getPrice() {
float price = 0;
ItineraryStep tratta = this;
if (tratta.step instanceof Motorway) {
price += ((Motorway) tratta.step).price;
}
while (tratta.hasNext()) {
tratta = tratta.next();
if (tratta.step instanceof Motorway) {
price += ((Motorway) tratta.step).price;
}
}
return price;
}
------------------
public float getPrice() {
if(!this.hasNext() && this instanceof Motorway) return this.step.price;
return this.step.km + getPrice(this.next());
}
public float getPrice(ItineraryStep i1) {
if(!i1.hasNext() && i1 instanceof Motorway) return i1.step.price;
return i1.step.price + getPrice(i1.next());
}
------------------
public int getTime() {
int time = 0;
ItineraryStep tratta = (ItineraryStep) this;
time += tratta.step.time;
while (tratta.hasNext()) {
tratta = tratta.next();
time += tratta.step.time;
}
return time;
}
------------------
public int getTime() {
if(!this.hasNext()) return this.step.km;
return this.step.km + getTime(this.next());
}
public int getTime(ItineraryStep i1) {
if(!i1.hasNext()) return i1.step.time;
return i1.step.time + getTime(i1.next());
}
------------------
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("ItineraryStep [step=");
builder.append(step);
builder.append(", next=");
builder.append(next);
builder.append("]");
return builder.toString();
}
}