Java Programmieraufgabe "Collatz-Folge"?

7 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Wie sieht dein Programm denn aus?

Nichtsnutz12 
Fragesteller
 04.11.2019, 18:16

Siehe link da ist mein Code

0

 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.

Nichtsnutz12 
Fragesteller
 04.11.2019, 18:26

Hmm oke echt nur dort der Fehler?

0
AOMkayyy  04.11.2019, 18:30
@Nichtsnutz12

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:

  1.  if (n == 4444) {
  2.      break;
  3.     }
1
Nichtsnutz12 
Fragesteller
 04.11.2019, 18:33
@AOMkayyy

Das hat die Funktion das Fall 4444 gefunden wurde ist das es die for Schleife abbricht.

0
Nichtsnutz12 
Fragesteller
 04.11.2019, 18:44
@AOMkayyy

Ja es klappt es lag dran das da while >1 stehen muss statt while > 0

1

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.

Woher ich das weiß:Studium / Ausbildung

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.

Nichtsnutz12 
Fragesteller
 04.11.2019, 18:35

Ok danke echt wenn das mein einziger Fehler war wär das gut ok Probier ich später ich bin grad im Aldi

0
Noel93  04.11.2019, 18:36
@Nichtsnutz12

Ich hab es gerade probiert und es kam ne Zahl raus, also.. sollte passen ^^

1

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.

bluebird5  04.11.2019, 19:56

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. ;)

0