Zahlenreihe generieren.

Chillchen

Mitglied
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]
 

PissPain

Aktives Mitglied
Du könntest eine Methode schreiben, die sich mit dem überarbeitetem Wert immer wieder bis 1 aufruft:
Java:
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

Mitglied
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]
 
Zuletzt bearbeitet:

Chillchen

Mitglied
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]

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

PissPain

Aktives Mitglied
Schau dir das noch ein wenig an, aber du hast es fast geschafft :)

Java:
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
    }
 

Oben