# Zahlenreihe generieren.



## Chillchen (28. Jan 2015)

Hallo Zusammen.
Ich bin blutiger Anfänger und soll nun ein kleine Methode schreiben, die dieses Problem löst.

Liefert die Anzahl nötigen Operation, um von n1 zu erreichen, wobei die Operation folgende ist:
wenn n ungerade ist, wird n = 3*n+1 gerechnet. 
Andernfalls wird n = n/2 gerechnet. 
z.B. ist Programm (7) = 16 Sequenz 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1


Meine Frage ist jetzt, wie ich anstatt immer und immer wieder die gleiche if oder while methode schreibe, eine elegante Methode finde wie dies auch z.b für die Zahl 5000 gehen würde. Also quasi eine schleife in einer schleife die sich selbst wieder aufruft bis man bei 1 angelangt ist.
Könnte da mir jemand helfen?
[Java]
public static int ulam(int n) {
        if (n%2==0){ //gerade Zahl
         n=n/2;


        }

        while (n%2!=0){ //ungerade Zahl
            n=3*n+1;

        }
[/Java]


----------



## PonySlaystation (28. Jan 2015)

Das, was du da machst ist das sogenannte Collatz Problem.
Pack deine if-Abfrage doch einfach mal in eine schleife, wie würde die dan aussehen??


----------



## PissPain (28. Jan 2015)

Du könntest eine Methode schreiben, die sich mit dem überarbeitetem Wert immer wieder bis 1 aufruft:


Spoiler: Spoiler





```
public static void main(String[] args) {
		ulam(5000);		//Methode ausführen
	}
	
	private static int ulam(int n) {
		if((n % 2) == 0) 	//Prüfen auf ungerade Zahl
			return ulam(n / 2); 	//Sich aufrufen mit dem neuem Wert
		
		return (n == 1) ? n : ulam(n * 3 + 1); //Falls ungerade, prüfen ob sie den Wert 1 hat (falls, dann wird auch 1 (n) returned), wenn nicht, dann sich aufrufen mit dem neuem Wert
	}
```


----------



## Chillchen (28. Jan 2015)

Danke für die Antworten. Ich hab im Internet gelesen, dass es sich um eine rekursive Methode handelt, sich also immer wieder neu aufruft.

Ich hab jetzt einfach mal ein wenig gebastelt und blindlings drauflos probiert. Wie komme ich jetzt allerdings wieder aus dieser Methode heraus? Gibt es da einen Befehl dafür so das ich am Ende das Resultat 1 erhalte?

mein Code bis jetzt:

[Java]
  public static int ulam(int n) {
        if(n==1){
            if(n!=1){
                if (n%2==0){ //gerade Zahl
                    n=(n/2);
                    //ulam(n);        
                }else{   
                    n=(3*n+1); //für eine ungerade
                    //ulam(n);   
                }
            }
        }
        return 1;
    }

[/Java]


----------



## Chillchen (28. Jan 2015)

Chillchen hat gesagt.:


> Danke für die Antworten. Ich hab im Internet gelesen, dass es sich um eine rekursive Methode handelt, sich also immer wieder neu aufruft.
> 
> Ich hab jetzt einfach mal ein wenig gebastelt und blindlings drauflos probiert. Wie komme ich jetzt allerdings wieder aus dieser Methode heraus? Gibt es da einen Befehl dafür so das ich am Ende das Resultat 1 erhalte?
> 
> ...



Bin mir nicht ganz sicher ob das jetzt die Lösung ist.


----------



## PissPain (28. Jan 2015)

Schau dir das noch ein wenig an, aber du hast es fast geschafft 


```
public static int ulam(int n) {
        if(n==1){ //Weshalb fragst du hier doppelt? 
            if(n!=1){	//Unmöglich, weil oben das Gegenteil abgefragt wird
                if (n%2==0){ //gerade Zahl
                    n=(n/2);
                    ulam(n);        
                }else{   
                    n=(3*n+1); //für eine ungerade
                    ulam(n);   
                }
            }
        }
        return 1; //Eigentlich muss nichts returned werden
    }
```


----------



## Chillchen (28. Jan 2015)

Vielen herzlichen DANK! Top deine Hilfe.

Und ein super Gefühl, das erste Ding geschrieben zu haben!


----------

