Originalkern
Berechne die Laufzeit, stelle eine Rekurrenzrelation auf und löse sie in eine geschlossene Form.
Vorbedingung: Das Programm terminiert nur für x ≥ 1.
Dein erster Zug: Entscheide, wie viele rekursive Aufrufe fun(x) pro Ebene startet.
Berechne die Laufzeit, stelle eine Rekurrenzrelation auf und löse sie in eine geschlossene Form.
Vorbedingung: Das Programm terminiert nur für x ≥ 1.
int fun(int x) {
if (x == 1) return 1;
int zw = fun(x - 1);
return zw * x;
}
30-SEKUNDEN-START
int zw = fun(x - 1) heißt: „Rufe dieselbe Funktion mit einem um 1 kleineren Problem auf und merke das Ergebnis.“
Eine Ebene erledigt konstant viel Arbeit und reicht dann an x−1 weiter. Welche Formel beschreibt das?
fun(…) in einem nicht-trivialen Aufruf vorkommt.zw * x kostet einen Schritt. Sie vervielfacht den Wert, nicht die Zahl der Aufrufe.Die PDF zählt pro normalem Aufruf 3 Schritte, im Basisfall 2. Erzeuge die Werte nacheinander.
Starte bei 2 und addiere pro Ebene immer 3.
Schreibe die geschlossene Form und die asymptotische Laufzeit. Beispielsyntax: 3x-1, Theta(x).
T(1)=2.x>1: ein rekursiver Aufruf und drei gezählte Schritte, also T(x)=3+T(x−1).2, 5, 8, 11, …. Jede Erhöhung von x addiert 3.T(x)=3x−1, also T(x) ∈ Θ(x).fun(x) berechnet zwar x!, aber nur über eine Kette von x Aufrufen. Ergebniswachstum ≠ Laufzeitwachstum.Wie fühlt sich genau diese Mechanik an?