Fakultät-Rechner in Java programmieren?
Ich habe folgendes Programm:
public class test {
public static void main(String[] args) {
System.out.println(fakulteat(5));
}
public static int fakulteat(int zahl) {
if (zahl == 1) {
return 1;
} else {
return zahl * fakulteat(zahl - 1);
}
}
}
Hier wird jetzt ja die Fakultät berechnet durch diese rekursive Methode.
Mein Problem steckt folgender Zeile:
return zahl * fakulteat(zahl - 1);
Damit gibt man dann so gesagt " 5 * 4! " an die Methode zurück.
Was ich mich aber Frage ist halt, wieso " fakulteat(zahl - 1) " jetzt eine Fakultät darstellt. Der Methode gibt sich selbst damit doch nur einen Wert zurück, woher weiß aber die Methode, dass dann z.B. 4! = 1 * 2 * 3 * 4 gemeint ist?
2 Antworten
Das hängt einfach mit der Rekursion zusammen. Die Methode ruft sich selbst auf und bricht ab, wenn die Zahl = 1 ist.
Du rechnest also 5*fak(4)
Das ist 5*4*fak(3) usw. Bis du bei 1 angekommen bist.
Weil die fakulteat Methode rekursiv ist und sich selbst mit einem veränderten Parameter aufruft. Die Rekursion bricht ab, wenn die Methode mit dem Parameter 1 aufgerufen wird, weil die Fakultät von 1 per Definition 1 ist.
Stimmt, die 0! habe ich vergessen. Allerdings endet die auch in keiner Endlosschleife, weil irgendwann ein Überlauf in die positven Zahlen erfolgt und die dann bei 1 enden. Das Ergebnis wird dann wohl Plattform- und Compiler abhängig sein.
Von Aufrufen wie falkultaet(-1) fange ich gar nicht erst an.
Entweder es vor dem ersten Aufruf der Funktion fakultaet() geprüft, ob die übergebenen Werte sinnvoll sind, oder in der Funktion selber, was die Effektivität stark bremsen würde, weil dann die Prüfung immer wieder stattfindet.
Dann ist noch zu Kontrollieren, wie große die Zahlen bei int werden können. Hier ist auch die Plattform und Compiler entscheidend, sonst läuft der Rückgabewert über und es kommt Unsinn als Rückgabe.
Das Programm vom Fragesteller ist also weit von einem Programm entfernt, das die Anforderung an die Berechnung der Fakultät fehlerfrei erfüllt.
Wenn du wirklich viel Speicher hast, kannst du auch vorher schon eine Wertetabelle mit einbauen, wo nur der Wert n! zu einem gegeben n gezogen wird.
Ein richtig gut optimierender Compiler könnte hier gleich ausrechnen, dass in dem Aufruf
System.out.println(fakulteat(5));
besser nur
System.out.println(120);
stehen muss in die Funktion selber wegoptimieren.
MyTwoCents
Wieso geht nicht
?