Class Loesung31c

java.lang.Object
  extended by ArraySum
      extended by Loesung31c

public class Loesung31c
extends ArraySum

Loesungsvorschlaege fuer Aufgabe 3-1c.

Diese Klasse enthaelt vier verschiedene Beispiele fuer moegliche Loesungsansaetze. Traditionell ist die Toggle-Loesung die bevorzugte, weil sie in allen imperativen Programmiersprachen (von Assembler bis einschliesslich Java) sehr einfach zu implementieren ist. Diese Methode ist die beste Loesung fuer dieses Problem.

Waehrend die rekursive Loesung durch ihre unuebertroffene Einfachheit besticht, ist ihr praktischer Nutzen in Java eingeschraenkt (siehe Aufgabe 3-4). Der Ansatz mit Modulo-Formel ist vergleichsweise schwer verstaendlich und sollte daher nur Anwendung finden, wenn aus irgendeinem Grund die anderen Methoden nicht praktikabel sind. Beide Methoden sind langsamer als die Toggle-Loesung.

Obwohl in objektorientierten Sprachen wie Java eine weitere Loesung mit Ausnahmenbehandlung moeglich ist, sollte sie niemals verwendet werden. Sie ist naemlich zwar einfach zu schreiben, aber schwer zu lesen; ausserdem ist er sehr langsam. Naeheres erklaert Josh Bloch in Effective Java auf Seite 169 ff.; vgl. Java Puzzlers Puzzle 42, S. 89.

Version:
$Revision: 1.4 $
Author:
Arne Johannessen
See Also:
Effective Java, Java Puzzlers, Aufgabenblatt 3

Field Summary
 
Fields inherited from class ArraySum
ARRAY
 
Constructor Summary
Loesung31c()
           
 
Method Summary
static int alternatingSumException(int[] array)
          Deprecated. Effective Java Item 39: Use exceptions only for exceptional conditions.
Diese Art, eine Schleife zu verwenden, ist zwar dem Problem angemessen, aber schwer verstaendlich und dazu noch sehr langsam in der Ausfuehrung. Sie sollte daher nie verwendet werden.
static int alternatingSumModulo(int[] array)
          Loesungsvorschlag fuer Aufgabe 3-1c mit Anwendung einer Modulo-Formel.
static int alternatingSumRecursion(int[] array, int index)
          Rekursiver Loesungsvorschlag fuer Aufgabe 3-1c.
static int alternatingSumToggle(int[] array)
          Loesungsvorschlag fuer Aufgabe 3-1c mit Toggle (Umschalten).
static void main(String[] args)
          Treiber fuer Aufruf von der Kommandozeilenschnittstelle.
 
Methods inherited from class ArraySum
printArray
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

Loesung31c

public Loesung31c()
Method Detail

alternatingSumModulo

public static int alternatingSumModulo(int[] array)
Loesungsvorschlag fuer Aufgabe 3-1c mit Anwendung einer Modulo-Formel.

Berechnet die "alternierende Summe" aller Elemente eines Arrays. Dazu wird das jeweils richtige Vorzeichen fuer jedes Array-Element anhand einer Modulo-basierten Formel errechnet und dann mit jedem Summanden multipliziert.

Parameters:
array - das aufzusummierende Array
Returns:
die alternierende Summe von array
Throws:
NullPointerException - falls array == null

alternatingSumToggle

public static int alternatingSumToggle(int[] array)
Loesungsvorschlag fuer Aufgabe 3-1c mit Toggle (Umschalten).

Berechnet die "alternierende Summe" aller Elemente eines Arrays. Dazu wird das jeweils richtige Vorzeichen in Form eines Boolean-Flags gespeichert und bei jeder Iteration umgeschaltet.

Parameters:
array - das aufzusummierende Array
Returns:
die alternierende Summe von array
Throws:
NullPointerException - falls array == null

alternatingSumRecursion

public static int alternatingSumRecursion(int[] array,
                                          int index)
Rekursiver Loesungsvorschlag fuer Aufgabe 3-1c. Berechnet rekursiv die "alternierende Summe" aller Elemente eines Arrays von einem bestimmten Element an.

Das durch index angegebene Element wird addiert und die durch die Rekursion gelieferte Summe des Rest-Arrays subtrahiert. Durch das Prinzip der Invertierbarkeit ("minus und minus gibt plus") ergibt sich direkt die alternierende Summe.

Parameters:
array - das aufzusummierende Array
index - der Index des ersten aufzusummierenden Elementsersten
Returns:
die alternierende Summe aller Elemente von array ab index; 0, falls index >= array.length
Throws:
NullPointerException - falls array == null

alternatingSumException

public static int alternatingSumException(int[] array)
Deprecated. Effective Java Item 39: Use exceptions only for exceptional conditions.
Diese Art, eine Schleife zu verwenden, ist zwar dem Problem angemessen, aber schwer verstaendlich und dazu noch sehr langsam in der Ausfuehrung. Sie sollte daher nie verwendet werden.

Loesungsvorschlag fuer Aufgabe 3-1c mit Ausnahmenbehandlung.

Berechnet die "alternierende Summe" aller Elemente eines Arrays. Dazu werden bei jedem Iterationsschritt zwei Array-Elemente als Additions-Subtraktions-Paar gemeinsam behandelt. Anstelle einer Abbruchbedingung wird auf das Auftreten einer Ausnahme beim Array-Ueberlauf gewartet.

Parameters:
array - das aufzusummierende Array
Returns:
die alternierende Summe von array
Throws:
NullPointerException - falls array == null
See Also:
Effective Java

main

public static void main(String[] args)
Treiber fuer Aufruf von der Kommandozeilenschnittstelle.



Gehe zurueck zur Tutoriums-Homepage