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.
 
Java:
  static void collatz (int a)
  static int collatz(int n)

Das wird nicht gehen, 2 Methoden mit selbem Namen UND Selber Parameterliste.
 
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:
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.....
 
vielen dank für die hilfe....ich versuch das mal jetz alleine mit der indirekten rekursion....ich hoffe ich krieg das hin...
 
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. 😀
 
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. 😀
 
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.
 

Zurück
Oben