0 Daumen
2k Aufrufe

Frage:

Schreiben Sie ein Programm Collatz.java, welches als Kommandozeilenparameter eine natürliche
Zahl n > 0 erhält und, ausgehend von dieser Zahl n, eine Folge a_0; a_1; a_2; .... entsprechend der
Vorschrift
• a_0 = n.
• Falls a_i gerade ist, setze a_i+1 = a_i/2 .
• Falls a_i ungerade ist, setze a_i+1 = 3ai + 1.
berechnet. Die Berechnung der Folge soll abgebrochen werden, sobald das erste Mal der Wert 1
in der Folge auftaucht. Entsprechend einer Vermutung des Mathematikers Lothar Collatz muss
dieser Wert früher oder später auftauchen. Das Programm soll die Folgeglieder bis zum Erreichen
der ersten 1 durch Kommas getrennt auf dem Bildschirm ausgeben


Code:

Avatar von

Was hast du denn schon probiert? Wie sieht dein Code bis jetzt aus?

Noch nicht geschrieben ich weiß nicht wie ich anfangen soll. Kannst du mir sagen worauf ich achten soll oder so

Du brauchst schon Mal die Klasse java.util.scanner um Eingaben zu lesen. Dann musst du Abfragen, ob die eingelesene Zahl positiv ist. Als nächstes berechnest du die Folgeglieder und printest für jedes Folgeglied den String in der Konsole aus. Beachte dabei die Fallunterscheidungen für die Berechnung der Folgeglieder und die Abbruchbedingung für den Wert 1.

Wie kann man denn Abfragen, ob eine Zahl gerade oder ungerade ist?

Ich hab eine Frage und zwar was ist n und a_i hier? Also was wurde damit gemeint?

Richtig so oder fehlt noch irgendwas?

public class Collatz {
public static void collatz(int n) {
    System.out.print(n + " ");
    if(n==1) return;
    else if(n<0) System.out.println("n muss nicht kleiner als 0 sein!");
    else if(n% 2 == 0) collatz(n / 2);
    else collatz(3*n + 1);
}

public static void main(String[] args) {
    int n = Integer.parseInt(args[0]);
    collatz(n);
}

}

a_i ist das i-te Folgeglied.

In deinem Code fehlt noch das Einlesen von Eingaben von der Konsole. Dafür brauchst du die Scanner-Klasse (wie schon gesagt). Außerdem sollst du jedes Folgeglied auf der Konsole ausgeben.

Könntest du mir bitte zeigen wie die Ausgabe sein soll? Dann verstehe ich genau was die Aufgabe lautet

Vielen Dank im Voraus! :))

Gib einfach mit System.out.print(n + ", "); das Folgeglied in jedem Fall aus. Dann erhältst du eine Liste der Folgeglieder mit Kommas getrennt. (Hast du anscheinend auch schon in deinem Kommentar bearbeitet. So ist es ok, nur noch ein Komma einfügen.) 

Ich schreibe gleich eine Antwort.

Ich habe eine Antwort geschrieben. Dein Code ist jetzt korrekt, es fehlte nur noch die Eingabe per Konsole und das Ausgeben der Folgeglieder mit einem Komma. Die habe ich hinzugefügt. Ich habe zur Lesbarkeit noch ein paar Klammern in den if-Abfragen hinzugefügt. Der Rest funktioniert, auch die Rekursion.

Man kann das Ganze natürlich auch iterativ machen.

1 Antwort

0 Daumen

Deine Code sieht schon gut aus, es funktioniert fast alles. Deine Ausgabe der Folgeglieder ist noch nicht ganz richtig. Er sollte durch Kommata getrennt werden. Außerdem sollte der Nutzer seine Zahl in die Konsole eingeben können. Das habe ich noch hinzugefügt und den Code etwas lesbarer gemacht: (Du musst die Klasse natürlich wieder umbennen in Collatz.java). Jetzt ist deine Aufgabe erfüllt:

import java.util.Scanner;

public class Main {
  public static void collatz(int n) {
      System.out.print(n + ",");
      if (n == 1) {
          return;
      } else if (n < 0) System.out.println("n muss nicht kleiner als 0 sein!");
      else if (n % 2 == 0) {
          collatz(n / 2);
      } else {
          collatz(3 * n + 1);
      }
  }

  public static void main(String[] args) {
      Scanner scanner = new Scanner(System.in); //Eingabe per Konsole
      System.out.println("Zahl eingeben");
      int n = scanner.nextInt(); //Eingabe wird in n gespeichert
      collatz(n);
  }
}

Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community