public class Fak { public static int facRec(int n) { // Abbruchbedingung(en): if (n <= 0) return 1; // Rekursiver Aufruf: return n * facRec(n-1); } public static int facTailRec(int n) { // Rufe die Hilfsmethode mit passenden Parametern auf und gib Ergebnis zurück: return facTailRecHelper(n, 1); } /** * Hilfsmethode, welche (die Zahl, für die die Fakultät berechnet werden soll) * übergeben bekommt und die Berechnung endrekursiv mittels eines zusätzlichen * Parameters durchführt. dient als dabei Akkumulator, d. h. es wird immer * das bisher berechnete Zwischenergebnis übergeben (sodass am Ende einfach dieses * Zwischenergebnis zurückgegeben werden kann). * * Endrekursion = Nach dem rekursiven Aufruf passiert nichts mehr, d. h. das * Ergebnis kann direkt zurückgegeben werden (return), aber es findet keine * Berechnung/Vergleich o. Ä. mehr statt. Alle Berechnungen werden davor ausgeführt * (daher nutzt man hier meistens einen zusätzlichen Parameter). */ private static int facTailRecHelper(int n, int k) { // Abbruchbedingung(en): if (n <= 0) return k; // Rekursiver Aufruf: return facTailRecHelper(n-1, n*k); // -> "n*" wurde reingezogen } public static int facIt(int n, int k) { while (true) { if (n <= 0) return k; // wie beim rekursiven Aufruf: neues n bzw. k ist... k = n*k; n = n-1; } } }