Von Programming Language Pragmatics, by Scott, in Bezug auf in-Futter und Rekursion:Wie inline mit Rekursion verwenden?
In-line Erweiterung ist auch keine Option im allgemeinen Fall für rekursive Unterprogramme. Für den gelegentlichen Fall, in dem ein rekursiver -Aufruf möglich, aber unwahrscheinlich ist, kann es wünschenswert sein, eine echte rekursive Unterroutine zu erzeugen, aber zu eine Ebene dieser Routine inline an jeder Aufrufstelle zu erweitern.
Betrachten Sie als einfaches Beispiel einen Binärbaum, dessen Blätter Zeichenfolgen enthalten. Eine Routine den Rand dieses Baumes zurückzukehren (die von links nach rechts Verkettung der Werte in den Blättern) wie dies in C aussehen könnte ++:
string fringe(bin_tree *t) { // assume both children are nil or neither is if (t->left == 0) return t->val; return fringe(t->left) + fringe(t->right); }
Ein Compiler diesen Code in-line erweitern wenn es jeden verschachtelten Aufruf zu einem echten Unterroutinenaufruf macht. Da die Hälfte der Knoten in einem binären Baum Blätter sind, wird diese Erweiterung die Hälfte der dynamischen Aufrufe zur Laufzeit eliminieren.
Wenn wir nicht nur die Wurzel Anrufe erweitern sondern auch (eine Ebene) die beiden Anrufe innerhalb des wahren Unterprogramm Version, nur ein Viertel der ursprünglichen dynamischen Anrufe bleiben.
Ich habe Probleme, die folgenden Sätze zu verstehen:
- "erweitern einer Ebene dieser Routine in-line bei jedem Anruf Ort"
- „diesen Code in-line erweitern, wenn es jeder macht verschachtelter Aufruf ein wahrer Unterprogrammaufruf. "
- „erweitern nicht nur die Wurzel Anrufe, sondern auch (eine Ebene) die beiden Anrufe innerhalb der wahren Unterprogramm-Version“
Was eigentlich bedeuten sie? Könntest du sie mit dem gegebenen Beispiel erklären, zum Beispiel zeigen, wie der Code nach der Handlung jedes Satzes ist?
Danke.
Der Code ist genau so wie es ist, aber der Compiler kann entscheiden, einen Aufruf und auch k Halten Sie eine nichtlineare Version der gleichen Funktion ein. –