Ich komme aus dem Bereich des PHP und wollte man einen Einblick in die Welt des Java gewinnen Nun habe ich mir dir Collatz-Funktion vorgeknöpft, komme aber nicht wirklich weiter. Mein Code sieht so aus:
Java:
importAlgoTools.IO;publicclassCollatz{publicstaticvoidmain(String[] argv){int x,y,z,i;
y = IO.readInt("Von: ");
x = IO.readInt("Bis: ");
z =0;for(i = y; i <= x; i++){
IO.println("--------------------");
IO.println("Aktuelle Zahl: "+ i);while(i !=1){if(i %2==0){
i = i /2;}else{
i =3*i+1;
z = z+1;}
IO.println("Iteration("+ i +") = "+ z);continue;}}}}
Das Problem besteht an der inneren Iteration. Grundsätzlich soll er einen Bereich abfragen (y = min; x = max). Das heißt, man kann 1;10 eingeben und dann soll die Collatz-Funktion für alle Zahlen im Bereich von 1-10 abgearbeitet werden.
Problem: Script bleibt bei Zahl 2 stehen und gibt lauter "Aktuelle Zahl:2" und "Iteration(1) = 0" aus. Es ist mir auch dann klar, dass er diese While Bedingung niemals lösen kann, deshalb kommen auch die vorher genannten Begriffe ständig. Aber wie macht man das richtig? Darf man in Java nicht 2 Schleifen verschachteln??
Das Problem ist, das Java zwischen Flieskomma und Integer unterscheidet, was PHP schon mal nicht tut. Dividiert man 2 solcher Integer, so erhält man auch wieder einen Integer, welcher möglicherweise abgrundet ist. So ergibt [c]1 / 2[/c] z.B. [c]0[/c] und nicht [c]0.5[/c] wie man es in PHP gewohnt ist. Lösung: float statt int verwenden.
@Edit: Bei nochmaligem studieren des Codes fällt mir auf, das dort niemals [c]1 / 2[/c] gerechnet wird und man das ganze definitiv auch mit int hinbekommt. Der entscheidene Fehler ist, das inerhalb der while Schleife der Schleifenzähler der for Schleife zurückgesetzt wird.
Da nur gerade Zahlen geteilt werden sollte das imo nicht das Problem sein.
Aber überleg doch mal was bei i=2 passiert?
2 % 0 = 0 -> 2 wird durch 2 geteilt -> ergibt 1
Vor dem nächsten Durchlauf wird i wieder um 1 erhöht -> 1+1 = 2
Und der Spaß beginnt von vorn. Das Problem sollte so in Php auch auftreten imho.
importjava.util.Scanner;publicclassCollatz{publicstaticvoidmain(String[] argv){int x, y, z, i, iteration;Scanner sc =newScanner(System.in);System.out.println("Von: ");
y = sc.nextInt();System.out.println("Bis: ");
x = sc.nextInt();
z =0;for(i = y; i <= x; i++){
z = i;
iteration =1;System.out.println("--------------------");System.out.println("Aktuelle Zahl: "+ i);while(z !=1){if(z %2==0){
z = z /2;}else{
z =3* z +1;}System.out.println("Iteration("+ iteration +") = "+ z);
iteration++;}}}}
Sorry, aber ich hab bei der Version diese bekloppten Algotools rausgeschmissen, weil ich die nicht hab. Ich denke, die Lösung ist selbsterklärend und Du kannst doch nicht mit i rumrechnen und dann erwarten, dass es danach wieder auf dem Stand vom Anfang ist. Kann sein, dass die Variablenbezeichnung z jetzt keinen Sinn mehr macht, n wäre wahrscheinlich sinniger.
Vielen vielen Danke für die ausführlichen und super schnellen Antworten!!
Ich habe mir das nochmal genau angeguckt und nun geschnallt, wie man das realisieren kann/soll. Danke euch allen nochmal, besonders an FatFire!!