# Collatz-Folge mittels indirekter Rekursion



## paco89 (12. Dez 2011)

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:


```
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 (12. Dez 2011)

```
static void collatz (int a)
  static int collatz(int n)
```

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


----------



## Landei (12. Dez 2011)

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


```
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:

```
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.


----------



## paco89 (13. Dez 2011)

ich habe den code umgeändert zu :


```
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 (13. Dez 2011)

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


----------



## Uwe von heuten (28. Dez 2011)

paco89 hat gesagt.:


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



Und wie hast du den Fehler beseitigt?


----------



## schntzl (6. Dez 2020)

Landei hat gesagt.:


> Du hast drei Lösungsmöglichkeiten: Einmal kannst du collatz selber in einer Schleife aufrufen:
> 
> 
> ```
> ...



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


----------



## schntzl (6. Dez 2020)

Landei hat gesagt.:


> Du hast drei Lösungsmöglichkeiten: Einmal kannst du collatz selber in einer Schleife aufrufen:
> 
> 
> ```
> ...



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


----------



## kneitzel (6. Dez 2020)

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.


----------

