Rekursives Programm zum Anzeigen von Primzahlen

Diskutiere Rekursives Programm zum Anzeigen von Primzahlen im Java Basics - Anfänger-Themen Bereich.
M

-Migjo-

Moin Leute,

ich bin gerade noch in der Übung die Rekursion zu "lernen" und mache deshalb alte Übungsaufgaben vom Prof., wo wir die Iteration angewendet haben, nur versuche ich das Problem mittels Rekursion zu lösen. Beim Primzahlentester war meine Idee, dass die Methode testet, ob die abgegebene Zahl % x ungleich null ergibt, ist dies der Fall soll es x um eins erhöht werden, bis x == i ist, sollte ein Modulo schon mittendrin auftreten, soll x auf 2 zurückgesetzt werden und die Grenze (i) um eins verringert werden.


import java.util.Scanner;

public class Primzahlen {
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
int i, x=2;
System.out.print("Bis zu welcher Zahl soll geprueft werden? : ");
i = sc.nextInt();
sc.close();
Primzahlentester (i,x);

}
public static boolean Primzahlentester (int b, int c) {
if(b == 2) {
System.out.print(b);
return true;
}
else if (b != 2 && b == c) {
System.out.println(b);

return Primzahlentester(b--, c=2);
}
else if (b%c != 0) {
return Primzahlentester (b, c++);
}
else {

return Primzahlentester(b--, c=2);
}
}
}
 
mihe7

mihe7

Wenn Du mit vernünftigen Bezeichnern - auch in Deiner Beschreibung - arbeiten würdest, wäre vieles klarer. Auch, wenn Du auf Zuweisungen jeglicher Art innerhalb von Parametern verzichten würdest, hättest Du ein Problem weniger. Abgesehen davon, ist diese Form von Zuweisungen absolut hässlich.

Der Post-Inkrement-Operator (EDIT: natürlich auch der Post-Dekrement-Operator) liefert den Wert der Variablen vor der Erhöhung. Du dürftest also in eine Endlosrekursion laufen, sofern b nicht durch 2 teilbar ist.
 
J

JustNobody

Also neben den Informationen von @mihe7 möchte ich noch darauf hinweisen, dass es auch noch zusätzlich von der Logik her Unsinn ist:
return Primzahlentester(b--, c=2);

Du veränderst b und c - aber da die Methode verlassen wird und der Gültigkeitsbereich der Variablen verlassen wird, macht es absolut keinen Sinn.

Ein paar Regeln, die ich Dir ans Herz legen würde:

a) Mach Parameter immer final, also z.B.:
public static boolean Primzahlentester (final int b, final int c) {
Das hat dann sozusagen den Vorteil, dass der Compiler Dich verhaut und uns diese Arbeit schlicht abnimmt. (Parameter zu ändern ist einfach extrem unschön und führt auch leicht bei Anfängern zu Problemen!)

b) Post- und Prä-Increment / -Decrement: Diese wirklich nur als eigenständige Anweisung verwenden. Also bitte wirklich niemals Code wie:
return Primzahlentester(b--, c=2);

Es ist toll, dass ihr diese Ausdrücke lernt und dann als Verständniskontrolle gefragt werdet, was z.B. ++c % c-- ist. Aber das hat mit wirklicher Entwicklung absolut nichts zu tun. Es ist toll, wenn man sich selbst ein Bein stellen will und Code schreiben möchte, den man als Anfänger vermutlich noch nicht einmal beim schreiben versteht....

Bei dem Code
return Primzahlentester(b--, c=2);
wäre also aus meiner Sicht der Aufruf:
return Primzahlentester(b-1, 2);
So du den Inhalt von b um eins reduziert aufrufen möchtest... Aber ich habe fast die Befürchtnis, das Du das Call By Value bei Parametern nicht ganz verstanden hast und möchstest, dass die Variablen, die übergeben wurden, geändert haben möchtest .... Aber das ist nur eine Vermutung ... So dem so sein sollte: Such bei Google einmal nach: Java Call by value
 
M

-Migjo-

Hey Mihe und JustNobody, erstmal vielen Dank für die Tipps. Mir fehlt noch einiges an Praxiserfahrung und eure Tipps haben geholfen, dass das Programm jetzt -wie in meiner Überlegung - funktioniert.
 
Thema: 

Rekursives Programm zum Anzeigen von Primzahlen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben