Aufgaben vollständig gelöst
-
Die geschlossene Form der Aufrufanzahl, wenn das naive fib(10) 177 Aufrufe macht 6 Schritte
Das Tool sagt, naives
fib(10)führt 177 Aufrufe durch undfib(11)benötigt 287. Finde die geschlossene Form für die Aufrufzahl und beweise sie. Berechne anschließend, wie weit naives Fibonacci in einer Sekunde auf einer Maschine kommt, die 108 Aufrufe pro Sekunde bewältigt.-
Addiere eins zu jedem Wert, das ergibt 178 und 288. Beide sind gerade, ihre Hälften lauten 89 und 144. Das sind exakt F11 und F12. Die Vermutung lautet also C(n) = 2F(n+1) − 1, mit F(1) = F(2) = 1.
-
Der Baum erklärt die Herkunft der Verdopplung. Jeder innere Knoten macht exakt zwei Aufrufe, jedes Blatt macht gar keinen. Folglich besitzt ein Baum mit L Blättern genau L − 1 innere Knoten und damit insgesamt 2L − 1 Knoten. Das Tool meldet 89 Basisfälle bei n = 10, und 2 × 89 − 1 = 177.
-
Zuerst die Basisfälle.
fib(0)undfib(1)enden ohne Rekursion. Es gilt also C(0) = C(1) = 1, und sowohl 2F(1) − 1 als auch 2F(2) − 1 ergeben 1. -
Nun zum Induktionsschritt. Nimm die Formel für n − 1 und für n − 2 als gegeben an. Der Aufruf bei n ist ein Knoten plus seine zwei Teilbäume. Die beiden Fibonacci-Zahlen darunter fallen durch die Definition der Folge selbst zusammen. Setzt du n = 11, ergibt das 2 × 144 − 1 = 287. Das entspricht exakt der Ausgabe des Tools.
-
Lass den Baum hier hinter dir. Die Formel von Binet liefert F(m) = (φm − ψm)/√5 mit φ = 1,6180 und |ψ| < 1. F(m) ist also φm/√5, gerundet auf die nächste Ganzzahl. Daraus folgt C(n) ≈ 2φn+1/√5. Eine Sekunde bei 108 Aufrufen pro Sekunde liefert dir genau 108 Aufrufe. Das fixiert φn+1 auf 1,1180 × 108.
-
Wende den Logarithmus an. ln(1,1180 × 108) = 18,5323 und ln φ = 0,4812. Daraus folgt n + 1 = 38,51 und n = 37,5. Runde ab, denn ein bruchteilhafter Aufruf wird nicht fertiggestellt.
Antwort
n = 37. Das Tool bestätigt die beiden Nachbarn: 78.176.337 Aufrufe bei n = 37 und 126.491.971 bei n = 38. Darüber hinaus verdoppelt jede weitere 1,44 in n die Arbeit, da ln 2 / ln φ = 1,44. Gleichzeitig zeigt das Kärtchen für verschiedene Teilprobleme bei n = 37 eine 38. Achtundsiebzig Millionen Aufrufe, um achtunddreißig Fragen zu beantworten – das ist das Argument für dynamische Programmierung in einer einzigen Zeile.
-
-
Drei Zweige, die langsamer wachsen als zwei 6 Schritte
Die Dreierschritt-Treppe ruft sich an jedem Knoten dreimal selbst auf, die Türme von Hanoi zweimal. Lade Treppe 20, drei Zweige, finde heraus, welcher der beiden Bäume schneller wächst, und entscheide, was der Verzweigungsgrad als Faustregel taugt.
-
Lies die Rekursionsgleichung aus der Definition ab, nicht aus dem Bild. Ein Aufruf für den Knoten selbst, dann drei weitere bei n − 1, n − 2 und n − 3, und alles bei 2 oder darunter kehrt zurück, ohne erneut zu rekursieren.
-
Nimm an, die Anzahl wächst geometrisch, C(n) ≈ A xⁿ, und setz das ein. Teile alles durch x hoch n − 3, die führende 1 bleibt als Rauschen niedrigerer Ordnung zurück, und übrig bleibt eine kubische Gleichung. Ihre einzige reelle Wurzel ist 1,8392868, die Tribonacci-Konstante.
-
Dasselbe Rezept auf die beiden anderen Definitionen. Fibonacci ruft sich bei n − 1 und n − 2 auf, also x² = x + 1 mit der Wurzel φ = 1,6180340. Hanoi ruft sich zweimal bei n − 1 auf, also x = 2, und es gibt nichts zu lösen.
-
Prüfe es, statt es zu glauben. Setz n auf 29, lies die Karte mit den ausgeführten Aufrufen ab, setz n auf 30, lies erneut ab, teile. Die Treppe gibt 1,83929, Fibonacci 1,61803, Hanoi genau 2. Fünf Nachkommastellen bei allen dreien.
-
Was die Wurzel dir nicht gibt, ist die Anzahl. 1,8393²⁰ ist 196.331, während die Karte 128.287 zeigt; davor sitzt also ein Faktor 0,65. Hanois Aufrufe sind exakt 2ⁿ⁺¹ − 1, ein Faktor 2. Die Basisfälle legen diese Konstante fest, die Rekursionsgleichung legt die Wurzel fest, und nur die Wurzel entscheidet, wer am Ende gewinnt.
-
Das Ende kommt hier schnell. Bei n = 20 macht Hanoi 16,3-mal so viele Aufrufe wie die Treppe, bei n = 30 sind es 37,8-mal so viele. Das Verhältnis verdoppelt sich alle 8,3 Schritte, denn ln 2 geteilt durch ln(2 ÷ 1,8393) ist 8,27.
Antwort
Hanoi wächst schneller, 2 gegen 1,8393, und der dritte Zweig kostet die Treppe nichts, was sie sich nicht leisten könnte. Der Verzweigungsgrad ist eine obere Schranke für die Wachstumsrate, und erreicht wird sie nur, wenn jedes Kind genau einen Schritt kleiner ist. Die Treppe gibt zwei ihrer drei Aufrufe für Argumente aus, die 2 und 3 kleiner sind, und diese Teilbäume sind so billig, dass sie den scheinbar gewonnenen Zweig nie zusammenbekommen.
Das Rezept ist der Teil zum Behalten, denn es funktioniert auch bei einer Definition, die niemand für dich gelöst hat. Zähle die Kinder, notiere, wie weit jedes das Argument senkt, schreibe x hoch dem größten Abfall als Summe von x hoch den übrigen Abfällen und nimm die größte reelle Wurzel. Eine Warnung gehört dazu: Das ist eine Aussage über den naiven Baum, und den naiven Baum würde niemand so schreiben. Die Karte mit den verschiedenen Teilproblemen zeigt bei n = 20 für die Treppe 21 und für Hanoi ebenfalls 21, ein Memo nimmt den Exponenten also ganz heraus, und die Wachstumsrate spielt keine Rolle mehr. -
Lernpfad