Java Programmieraufgabe "Collatz-Folge"?
mein code:
also bei mir kommt da ne Dauerschleife raus komischer weiße obwohl ich finde das ich das richtig programmiert hab aber weiß net wo der Fehler ist wer kennt sich aus?
Mit freundlichen Grüßen
7 Antworten
Wie sieht dein Programm denn aus?
for (int i = 0; i < 999999; i++) wieso nimmst du hier i<999999? i<=4444 würde doch vollkommen genügen, da es in dem Fall ja offensichtlich ist, das 4444 in der Folge vorkommt. Ist aber relativ egal
Das (while (n > 0) ) ist wohl dein Fehler, weil die Collatz-Folge nie 0 wird, wähle als Wert 4,2 oder 1.
Das ist mir jetzt spontan aufgefallen, sonst denke ich schon, dass es passen müsste. Geht es nicht?
Was für eine Funktion hat eigentlich das:
- if (n == 4444) {
- break;
- }
Das hat die Funktion das Fall 4444 gefunden wurde ist das es die for Schleife abbricht.
Achso :) Funktioniert es jetzt oder hast du immer noch Probleme?
Ja es klappt es lag dran das da while >1 stehen muss statt while > 0
Wenn du mit 1 in die While-Schleife gehst, wird der Wert immer über 0 sein, aber immer unter dem Wert 4444 bleiben -> Endlos-Schleife.
Ist der Wert z.B. 1, geht er in die While-Schleife:
n = 3*n+1 ---> 4
ist mit 4 in der While-Schleife:
n = n/2 ---> 2
ist mit 2 in der While-Schleife:
n = n/2 ----> 1
Dann fängts wieder von vorne an, weil du mit 1 wieder in die Schleife gehst.
Collatz zeichnet sich ja gerade dadurch aus, dass sich eine Endlosschleife des Zyklus' 4, 2, 1 ergibt. Deine while-Schleife beendet sich daher schon für i = 1 nie, da eben permanent 4, 2, 1, 4, 2, 1... durchlaufen wird. Statt while(n > 0) könntest du while (n > 1) nehmen, dann sollte das ganze schon klappen.
Ok danke echt wenn das mein einziger Fehler war wär das gut ok Probier ich später ich bin grad im Aldi
Ich hab es gerade probiert und es kam ne Zahl raus, also.. sollte passen ^^
Habs jetzt nur überflogen, aber zum einen ist die for-Schleife ungeeignet, weil du nicht weißt, ob der gesuchte Wert unterhalb von 999999 liegt (also wäre eine while-Schleife besser). Und zum anderen ist bei den Collatz-Folgen ganz oft der Gag, dass man nicht jeden Wert errechnen sollte, sondern sich Zwischenergebnisse speichern sollte.
Wenn wir beispielsweise mal von Wikipedia die Collatz-Folge für n = 19 nehmen
19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1
, dann könntest du, sobald du in einem höheren Schleifendurchlauf auf 19 triffst, die Folge abbrechen. Weil du schon weißt, dass in der 19er-Folge keine 4444 mehr kommt. Die 19er-Folge selbst kannst du aus dem gleichen Grund auch schon abbrechen, wenn du dort auf die 11 triffst. Es macht also Sinn, schon betrachtete Zahlen abzuspeichern. Vielleicht hast du keine Endlossschleife, sondern "nur" eine Schleife, die sehr sehr sehr lange läuft - vergiss erstmal die Suche nach der 4444 und konstruiere dir ein kleineres Beispiel.
OK, ich habs gerade selbst mal programmiert. Da die Lösung für die Aufgabe eine dreistellige Zahl ist, kann man das auch ohne Optimierung straight-forward programmieren. Man muss es halt nur richtig machen. ;)
Hmm oke echt nur dort der Fehler?