Fakultät-Rechner in Java programmieren?

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.

poscher 
Fragesteller
 13.12.2023, 16:18

Wieso geht nicht

return zahl * (zahl - 1);

?

0
teehouse  13.12.2023, 16:19
@poscher

Weil fak(6) dann z.B. 6*5 = 30 ausgeben würde. Es muss aber bis 1 runter gehen:

6! = 5*4*3*2*1 = 720

1
poscher 
Fragesteller
 13.12.2023, 16:25
@teehouse

Okay, danke, aber ist nicht 6! = 6 * 5 * 4 * 3 * 2 * 1 = 720 ?

0

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.

teehouse  13.12.2023, 16:15

Genau. Und streng genommen müsste sie erst bei 0 abbrechen.

1
KaePie  13.12.2023, 16:24
@teehouse

Wieso?

if (zahl == 1) {

return 1;

}

ist doch eindeutig. Bei „1“ rufe dich nicht selber auf, sondern gebe „1“ zurück.

1
teehouse  13.12.2023, 16:32
@KaePie

0! = 1. Das ist so definiert. Wird hier aber übersehen. Ein Aufruf mit 0 als Parameter endet in einer Endlosschleife.

0
KaePie  16.12.2023, 21:03
@teehouse

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

0
poscher 
Fragesteller
 13.12.2023, 16:18

Wieso geht nicht

return zahl * (zahl - 1);

?

0
KaePie  16.12.2023, 21:04
@poscher

Wenn du das fakultaet(5) aufrufst, ist der Rückgabewert 5 * (5 - 1) = 5 * 4 = 20. Das ist eindeutig falsch.

0