Hallo Leute,
ich hab ein Problem, ich muss ein Programm schreiben, welches die Ducci-Folge einer Reihe von Zahlen ausgibt. Soweit klappt alles, bis auf die Tatsache, dass die Folge nicht stoppt, wenn alle Werte in einer Zeile gleich sind und ich weiß nicht wieso, könnt ihr mir bitte helfen??
Java:
publicclassDucci{publicstaticbooleanallegleich(int[] ducci){for(int i=0; i<ducci.length-1; i++){if(ducci[i]== ducci[i+1]){returnfalse;}}returntrue;}publicstaticvoid main (String[] a){if(a.length <3){System.out.println("ERROR: Bitte geben Sie mindestens 3 Zahlen ein!");System.exit(1);}int[] ducci =newint[a.length];for(int i=0; i < a.length; i++){
ducci[i]=Integer.parseInt(a[i]);System.out.printf("%2d ", ducci[i]);}System.out.println();while(allegleich(ducci)){int s =0;for(int zeile=0; zeile < ducci.length; zeile++){
s++;int firstElement = ducci[0];int x;for(int i=0; i < ducci.length; i++){if(i == ducci.length-1){
ducci[i]=Math.abs(ducci[i]- firstElement);}else{
ducci[i]=Math.abs(ducci[i]- ducci[i+1]);}System.out.printf("%2d ", ducci[i]);}System.out.println();}System.out.println("Terminiert nach "+ s +" Schritten !");}}}
TKlausL hat recht, du musst aber außerdem noch [c]while(! allegleich(ducci)) { [/c] schreiben.
Kiri's Antwort stimmt nicht.
Tipp: Wenn man noch einen Schritt weiter als "alle Zahlen sind gleich" rechnet, hat man die Abbruchbedingung "alle Zahlen sind null", was noch einfacher zu testen ist.
Ich würde das Programm besser gliedern, für den "Überschlag" im Array den Modulo-Operator % verwenden, zur Ausgabe des Arrays die Klasse [c]java.util.Arrays[/c] verwenden:
Java:
publicclassDucci{privatestaticbooleanallegleich(int[] ducci){for(int n : ducci){if(n != ducci[0]){returnfalse;}}returntrue;}privatestaticvoidargumentTest(String[] a){if(a.length <3){System.out.println("ERROR: Bitte geben Sie mindestens 3 Zahlen ein!");System.exit(1);}}privatestaticint[]initArray(String[] a){int[] ducci =newint[a.length];for(int i =0; i < a.length; i++){
ducci[i]=Integer.parseInt(a[i]);}System.out.println(java.util.Arrays.toString(ducci));return ducci;}privatestaticvoidstep(int[] ducci){for(int i =0; i < ducci.length; i++){
ducci[i]=Math.abs(ducci[i]- ducci[(i +1)% ducci.length]);System.out.println(java.util.Arrays.toString(ducci));}}publicstaticvoidmain(String[] a){argumentTest(a);int[] ducci =initArray(a);int s;for(s =0;!allegleich(ducci); s++){step(ducci);}System.out.println("Terminiert nach "+ s +" Schritten !");}}
Normalerweise würde ich statt der ganzen statischen Methoden ein Ducci-Objekt verwenden, aber ich weiß nicht, ob ihr das schon hattet.
erstmal danke für eure hilfe,
aber mein problem besteht immer noch, also die Schleife hört immer auf, wenn
[JAVA=26] for(int zeile=0; zeile < ducci.length; zeile++) { [/code]
erreicht ist
und wenn ich jetzt 3 bzw 5 zahlen eingebe wird die ducci-folge immer wieder unendlich lang ausgegeben
wieso??
@landei du magst vielleicht recht haben, aber ich bin totaler anfänger und ich muss mein programm auch erklären können und deshalb belass ich es lieber bei meiner version
das mit den zahlen hat sich erledigt, die zahlen die ich eingegeben hab terminieren einfach nie weil die abstände nie gleich werden!
aber warum stoppt es immer noch nicht wenn alle werte gleich sind?