從Programming Language Pragmatics, by Scott,關於在襯裏和遞歸:如何使用遞歸內聯?
直列擴展也沒有針對 遞歸子程序一般情況下一個選項。對於可能的遞歸調用 但不太可能的偶爾情況,可能希望生成真正的遞歸子例程,但是要在處以的順序擴展該例程的一級 。
作爲一個簡單的例子,考慮一個葉子包含 字符串的二叉樹。例行返回此樹(在其葉子值的 左到右連接)的邊緣看起來 這樣在C++:
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); }
編譯器可以擴大在線驗證碼如果它使每個嵌套調用一個真子程序調用。由於二進制 樹中的一半節點是樹葉,因此此擴展在運行時將消除一半的動態調用 。
如果我們擴大不僅僅是根通話,但也真正的子程序版本內的兩個 電話(一個級別),只有 原有動態調用的四分之一將保留。
我無法理解下面的句子:如果它讓每個
- 「擴大在每次調用點在線,常規的一平」
- 「拓展在線驗證碼嵌套調用一個真正的子程序調用。「
- 「擴大不僅僅是根通話,但也真實子程序版本中的兩個電話(一平)」
什麼實際上他們的意思?你可以用給出的例子來解釋它們嗎,例如,在採取每個句子的動作之後,顯示代碼是什麼樣的?
謝謝。
代碼中的兩個電話(一平)是完全一樣的,但編譯器可以決定內聯一個電話,也可以k eep相同功能的非內聯版本。 –