Collatz-Folge mittels indirekter Rekursion

paco89

Bekanntes Mitglied
hallo,

lese grad ein java buch und da habe ich folgende aufgabe versucht zu lösen:


Eine Collatz-Folge (bekannt auch als Syracuse-Problem, Kakutani-Poblem, Hasse-Algorithmus und Ulam-Problem) von Lothar Collatz, 1937 ist definiert durch

n -> n/2, falls n gerade ist, n -> 3n+1,
falls n ungerade ist. Die Folge ist beendet, wenn 1 erreicht ist.

Beginnt man etwa mit n = 7, durchläuft der Algorithmus die folgenden Zahlen:

7 -> 22 -> 11 -> 34 -> 17 -> 52 -> 26 -> 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
Berechne die Collatz-Folge für den Startwert 27.


dazu habe ich folgenden code geschrieben:

Java:
public class Collatz
{

  static void collatz (int a)
  {
    collatz(int n);
  }

  static int collatz(int n)
  {
    if((n % 2) == 0 )
      return n/2;
    
    if((n % 2)!= 0)
      return 3*n+1;
      
      return n;
  }
  
  
  public static void main(String [] args)
  {
    System.out.print(collatz(27));
    
  }
}

ich habe versucht die aufgabe mittels indirekter rekursion zu lösen. d.h. jetzt, dass bei mir die erste collatz methode in zeile nichts anderes tun soll außer die zweite collatz methode aufzurufen.
mein compiler sagt mir aber, dass gerade in zeile 6 ein fehler vorliegt. genauer steht:
Collatz.java6: ´.class´ expected

ähm was ist dran falsch....


edit: ich hab mal getestet, wenn ich die 1. methode weglasse und nur mit der 2. arbeite dann funktioniert das, aber dann gibt er mir ein einziges mal die nächste folgende zahl aus. aber ich will ja ne folge haben, und da muss ich die methode ja mehrmals aufrufen können.
 

TKausL

Top Contributor
Java:
  static void collatz (int a)
  static int collatz(int n)

Das wird nicht gehen, 2 Methoden mit selbem Namen UND Selber Parameterliste.
 

Landei

Top Contributor
Du hast drei Lösungsmöglichkeiten: Einmal kannst du collatz selber in einer Schleife aufrufen:

Java:
int result = ...;
while(result != 1) {
   result = collatz(result);
   System.out.println("result");
}

Das wäre allerdings eine iterative Lösung.

Für eine rekursive Lösung musst du entweder die Ausgabe in collatz verlagern:
Java:
static void collatz(int n) {
   System.out.println(n);
   if (n != 1) {
       if (n % 2 == 0) {
          collatz(n/2); 
       } else {
          collatz(3*n+1); 
       }
   }
}

Oder du musst alle Ergebnisse sammeln (z.B. in einer Liste), um sie am Ende ausgeben zu können, was aber schwieriger wäre.
 
Zuletzt bearbeitet:

paco89

Bekanntes Mitglied
ich habe den code umgeändert zu :

Java:
public class Collatz
{

  static void collatz(int n)
  {
    System.out.println(n);
    if (n != 1)
    {
      if((n % 2) == 0 )
      {
        collatz (n/2);
      }
      else 
        {
          collatz (3*n+1);
        }
      }
     
    }
  
  
  public static void main (String [] args)
  {
    collatz(27);
  }
}


jetzt sagt der compiler mir, dass in zeile 19 ein return statement fehlt....hmmhh...



edit: jetzt funktionierts.....
 

paco89

Bekanntes Mitglied
vielen dank für die hilfe....ich versuch das mal jetz alleine mit der indirekten rekursion....ich hoffe ich krieg das hin...
 

schntzl

Neues Mitglied
Du hast drei Lösungsmöglichkeiten: Einmal kannst du collatz selber in einer Schleife aufrufen:

Java:
int result = ...;
while(result != 1) {
   result = collatz(result);
   System.out.println("result");
}

Das wäre allerdings eine iterative Lösung.

Für eine rekursive Lösung musst du entweder die Ausgabe in collatz verlagern:
Java:
static void collatz(int n) {
   System.out.println(n);
   if (n != 1) {
       if (n % 2 == 0) {
          collatz(n/2);
       } else {
          collatz(3*n+1);
       }
   }
}

Oder du musst alle Ergebnisse sammeln (z.B. in einer Liste), um sie am Ende ausgeben zu können, was aber schwieriger wäre.

Wie kann ich die Ergebnisse in einer liste sammeln, bin Anfänger und planlos. :D
 

schntzl

Neues Mitglied
Du hast drei Lösungsmöglichkeiten: Einmal kannst du collatz selber in einer Schleife aufrufen:

Java:
int result = ...;
while(result != 1) {
   result = collatz(result);
   System.out.println("result");
}

Das wäre allerdings eine iterative Lösung.

Für eine rekursive Lösung musst du entweder die Ausgabe in collatz verlagern:
Java:
static void collatz(int n) {
   System.out.println(n);
   if (n != 1) {
       if (n % 2 == 0) {
          collatz(n/2);
       } else {
          collatz(3*n+1);
       }
   }
}

Oder du musst alle Ergebnisse sammeln (z.B. in einer Liste), um sie am Ende ausgeben zu können, was aber schwieriger wäre.

Wie kann ich die Ergebnisse in einer liste sammeln, bin Anfänger und planlos. :D
 
K

kneitzel

Gast
Da wäre meine Bitte: Öffne dazu doch einfach einen eigenen Thread. Du bist hier in einem 9 Jahre alten Thread - da ist das Thema eigentlich abgehalt.

Ergebnisse in einer Liste sammeln: Dazu z.B. eine ArrayList nutzen. Einfach eine Instanz von ArrayList<Integer> erstellen und da mittels add Methode die jeweiligen int Werte speichern.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
sserio Längste Collatz-Folge Java Basics - Anfänger-Themen 11
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
T Operatoren Das Collatz Problem Java Basics - Anfänger-Themen 10
U Collatz mit 2 Schleifen Java Basics - Anfänger-Themen 4
I Collatz Problem Java Basics - Anfänger-Themen 3
S Abwandlung der Fibonacci Folge Java Basics - Anfänger-Themen 3
berserkerdq2 Wo geschieht der "Rücksprung, bei der rekursiven Folge Java Basics - Anfänger-Themen 5
D Grösste Zahl in einer Folge herausfinden. (ULAM) Java Basics - Anfänger-Themen 9
J Rekursive Folge (a=a-1) Java Basics - Anfänger-Themen 9
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
D Hofstäter Q Folge Java Basics - Anfänger-Themen 3
V Fibonacci Folge Java Basics - Anfänger-Themen 4
M Methoden Fibonacci-Folge Java Basics - Anfänger-Themen 6
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
S Negafibonacci Folge berechnen Java Basics - Anfänger-Themen 24
T Algortihmus: Kürzeste Folge zu einer Zahl Java Basics - Anfänger-Themen 40
G Harmonische Rekursive Folge Java Basics - Anfänger-Themen 3
M Fibonacci-Folge mit while-Schleife Java Basics - Anfänger-Themen 4
J Byte Folge erkennen Java Basics - Anfänger-Themen 5
A Gerade Terme der Fibonacci-Folge aufsummieren Java Basics - Anfänger-Themen 12
R Roboter - Helmich Folge 6 Java Basics - Anfänger-Themen 32
S rekursive folge verbessern Java Basics - Anfänger-Themen 2
H JOptionPane YES Option mit Folge? Java Basics - Anfänger-Themen 2
X Problem mit Ducci-Folge Java Basics - Anfänger-Themen 7
S Fibonacci Folge Java Basics - Anfänger-Themen 34
B Element in Folge suchen Java Basics - Anfänger-Themen 7
L iterative und rekursive Folge Java Basics - Anfänger-Themen 20
N Folge verschiedener Nährwerte zur Kubikwurzel Java Basics - Anfänger-Themen 15
I Fibonacci-Folge , direkter Weg. Java Basics - Anfänger-Themen 5
J Wurzel mit einer Folge brechnen Java Basics - Anfänger-Themen 5
E Rekursive definierten Folge Java Basics - Anfänger-Themen 10
D Bit-Folge bearbeiten Java Basics - Anfänger-Themen 2
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
M Anzahl Kommandozeilenparamter mittels Methode Java Basics - Anfänger-Themen 11
B Race Condition mittels Semaphore verhindern Java Basics - Anfänger-Themen 13
B Dom Manipulationen mittels Java Java Basics - Anfänger-Themen 8
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
D Gerade oder ungerade Zahl mittels Methoden Java Basics - Anfänger-Themen 13
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
Poppigescorn Arrayliste Mittels Scanner erweitern Java Basics - Anfänger-Themen 6
TimoN11 Quadratwurzel mittels Funktionswert der Quadratfunktion Java Basics - Anfänger-Themen 9
Khaled-Abo Ziffern unterscheiden mittels einer For-Schleife Java Basics - Anfänger-Themen 6
L Quadratwurzelrechnung mittels Heron-Verfahren Java Basics - Anfänger-Themen 6
P Klassenübergreifende Ausgabe mittels "getter" nicht möglich Java Basics - Anfänger-Themen 21
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
I csv auslesen, mittels List Java Basics - Anfänger-Themen 18
V Erste Schritte Potenzen b^n mittels Schleife ermitteln Java Basics - Anfänger-Themen 7
S XML mittels HTTP Get Anfrage Java Basics - Anfänger-Themen 4
W Teilstring durch Teilstring mittels StringBuilder ersetzen Java Basics - Anfänger-Themen 7
P Liste mit Lücken mittels Filter aggregieren Java Basics - Anfänger-Themen 7
M Methoden Mittelwert rationaler Zahlen mittels Methode Java Basics - Anfänger-Themen 4
P Klassen In einer Autoklasse das Objekt Auto mittels Collection Speichern Java Basics - Anfänger-Themen 4
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
K Methoden Zahlensysteme umwandeln mittels Rekursion Java Basics - Anfänger-Themen 5
S int-Array mittels Arrays.sort() in einer Schleife sortieren. Java Basics - Anfänger-Themen 2
A JavaScript Object Notation einbinden mittels Maven Java Basics - Anfänger-Themen 7
L Liste mittels Stack implementieren Java Basics - Anfänger-Themen 0
J OOP GUI-Einstellungen mittels Preferences Java Basics - Anfänger-Themen 0
J ComboBox mittels neuer Methode befüllen Java Basics - Anfänger-Themen 3
A Android-Lib: Sourcecode Generator mittels Annotation Processing Java Basics - Anfänger-Themen 0
W Erste Schritte Exceltabelle in Datenbank übertragen mittels XDEV Java Basics - Anfänger-Themen 7
L Histogram mittels Schleifen und Arrays Java Basics - Anfänger-Themen 9
S Klassen Tiefe Kopie mittels Kopierkonstruktor Java Basics - Anfänger-Themen 6
S Columnindex mittels Columnname herrausfinden Java Basics - Anfänger-Themen 6
M Explorer oeffnen mittels java.awt.Desktop Java Basics - Anfänger-Themen 18
Dogge URL-Ausgabe/Verarbeitungsproblem mittels einer Applikation Java Basics - Anfänger-Themen 2
H Methoden Array aus Punkten erzeugen, mittels Punkt-Klasse Java Basics - Anfänger-Themen 5
S Dateien mittels Path(s) kopieren und umbenennen. Java Basics - Anfänger-Themen 4
C Dynamische (AJAX) Inhalte einer Webseite mittels Java auslesen Java Basics - Anfänger-Themen 2
N Mittels For Schleife Klasse erzeugen Java Basics - Anfänger-Themen 32
B Abfrage mittels Variable vereinfachen Java Basics - Anfänger-Themen 6
D Klassen Zeichnen von Figuren mittels vorgegebener Klasse Java Basics - Anfänger-Themen 3
J Wurzelberechnung (mittels Newton) Java Basics - Anfänger-Themen 14
B Lotto mittels TreeSet Java Basics - Anfänger-Themen 3
C Vererbung "extends" umgehen mittels Objekterzeugung?! Java Basics - Anfänger-Themen 29
A String mittels RegEx filtern Java Basics - Anfänger-Themen 13
U E-Mails mittels Java senden. Java Basics - Anfänger-Themen 2
J Aufruf von Funktionen in *.jar mittels Eclipse Java Basics - Anfänger-Themen 4
E PHP Datei mittels Java aufrufen? Java Basics - Anfänger-Themen 3
P Collections Queue mittels ArrayList Java Basics - Anfänger-Themen 2
F Substring mittels RegEx ermitteln/ersetzen? Java Basics - Anfänger-Themen 2
R 3 Datumsangaben sortieren mittels Switch Java Basics - Anfänger-Themen 9
J Arraylänge mittels "Array.getLength" bestimmen!? Java Basics - Anfänger-Themen 3
I Ascii Bild mittels Scanner einlesen Java Basics - Anfänger-Themen 9
K OOP Datenkapselung mittels private - length Attribut bei Array Java Basics - Anfänger-Themen 3
M Delphi-DLL mittels JNI aufrufen Java Basics - Anfänger-Themen 11
H .jar Consolenprogramm mittels Doppelklick starten Java Basics - Anfänger-Themen 2
S SQL Anweisung mittels PreparedStatement Java Basics - Anfänger-Themen 15
M Additions mittels Rekursion Java Basics - Anfänger-Themen 15
E Array mittels Methode umgekehrt ausgeben Java Basics - Anfänger-Themen 6
Binary.Coder Skalarprodukt mittels long und binärzahlen Java Basics - Anfänger-Themen 5
M Auf Java (Desktop) Applikation mittels Webseite zugreifen Java Basics - Anfänger-Themen 6
W Suche nach strings zwischen eckigen Klammern mittels regulärer Ausdrücke Java Basics - Anfänger-Themen 3
Gonzalez Eingabe des Benutzers mittels readLine()-Methode. Klappt in meinem Beispiel nicht! Java Basics - Anfänger-Themen 7
R JTextField mittels JButton in Konsole ausgeben Java Basics - Anfänger-Themen 2
Z Terminkalender mittels Klassen und Feldern Java Basics - Anfänger-Themen 2
M Benutzer löschen mittels Netbeans Java Basics - Anfänger-Themen 4
I (fremde) IP mittels Applet auslesen Java Basics - Anfänger-Themen 6
G Mittels Runtime prüfen ob ein Programm läuft? Java Basics - Anfänger-Themen 18

Ähnliche Java Themen


Oben