Hallo, ich verstehe hier nicht warum nach stackframe 3 , stackframe 1 ausgeführt wird ?kann jemand das bitte erklären ?
Gib für die Ergebnisprozedur fibonacci die Belegung des Stacks zu dem Zeitpunkt an, an dem der Stack zum letzten Mal bei der Verarbeitung des Aufrufs fibonacci(5) seine maximaleHöhe erreicht.
Wähle hierbei aus den angebotenen Optionen pro Zeile = Stackframe die richtige aus. Dabei bedeutet
Platz_Rück = Rücksprungadresse, zu der das Programm nach der Methode springt
Platz_Par = An die Prozedur übergebene Parameter
Platz_Erg = Speicherplatz für Rückgabewert der Ergebnisprozedur
Platz_Zwisch = Speicherplatz für Zwischenergebnisse der Prozedur (hier z.B. erster Summand der Addition)
Berücksichtige, dass der Code, von dem aus fibonacci(5) aufgerufen wird, auch einen eigenen Stackframe benötigt. Kennzeichne ungenutzte Stackframes mit der Option [Leer].
Das entscheidende ist doch auch fett dargestellt - es geht um das letzte Mal bei dem die maximale Höhe erreicht wird.
Vielleicht hift es Dir, das einfach als Baum aufzumalen. Dann kannst Du da sehr schön sehen, wie der Verlauf des Stacks ist und du kannst dann sehen, wann hat er immer die maximale Tiefe und du kannst dann auch schauen, in welchem zeitlichen Verlauf diese erreicht wurden.
Dir ist klar, wie das mit dem Stack bei Methodenaufrufen funktioniert? Wie da mit jedem Aufruf etwas auf den Stack kommt? Und das kann man dann so darstellen, wie in dem Bild ja auch schon gezeigt wurde.
Du hast einen Stack-Stand bei dem Code, der dann die Methode aufruft. Durch den Methodenaufruf kommt dae ine Ebene drauf. Und wenn dann erneut eine Methode aufgerufen wird, dann kommt da wieder eine Ebene drauf. ... Die Anzahl der Ebenen wäre dann die Höhe. Da es immer um die gleiche Methode geht, ist also lediglich die Anzahl der Aufrufe wichtig - diese belegen alle den gleichen Platz.
Ja genau ... Aber da wäre noch die Frage, ob das eure Implementation ist. Mein erster Verdacht wäre, dass ihr bei fib(1) und fib(2) jeweils 1 zurück gebt. Damit gäbe keine Aufrufe bei fib(2) und du hast dann einen Baum der die größte Höhe hat bei den beiden Durchgängen:
fib(5)-fib(4)-fib(3)-fib(2)
fib(5)-fib(4)-fib(3)-fib(1)
Und bei zwei gleichen Höhen wollen wir die letzte haben. Welcher von beiden kommt zeitlich zuletzt?
Genau. Daher sind dann die Stackhöhe bei fib(2) und fib(1) gleich hoch, aber es wird der letzte Fall gesucht, daher bleibt es die Aufrufsequenz:
fib(5)-fib(4)-fib(3)-fib(1)
Gib für die Ergebnisprozedur fibonacci die Belegung des Stacks zu dem Zeitpunkt an, an dem der Stack zum letzten Mal bei der Verarbeitung des Aufrufs fibonacci(5) seine maximaleHöhe erreicht