在計算機科學裏,尾調用是指一個函數裏的最後一個動做是一個函數調用的情形:即這個調用的返回值直接被當前函數返回的情形。這種情形下稱該調用位置爲尾位置。若這個函數在尾位置調用自己(或是一個尾調用自己的其餘函數等等),則稱這種狀況爲尾遞歸,是遞歸的一種特殊情形。尾調用不必定是遞歸調用,可是尾遞歸特別有用,也比較容易實現。php
尾調用的重要性在於它能夠不在調用棧上面添加一個新的堆棧幀——而是更新它,如同迭代通常。尾遞歸於是具備兩個特徵:html
在C語言等語言中設計for, while, goto
等特殊結構語句,使用迭代、尾遞歸,對普通遞歸進行優化,減小可能對內存的極端消耗。函數
因爲不少 Scheme 的編譯器使用 C 做爲中間目標語言,問題變成如何在 C 裏在不讓棧向上長的前提下實現尾部遞歸(假設 C 的編譯器不優化尾部調用)。不少實現透過一種叫作彈跳牀的裝置,也就是一塊不斷進行函數調用的代碼。全部進入函數的過程都透過這個彈跳牀。當一個個函數須要尾部調用另外一個函數時,它不是直接調用該函數,而是將該函數的位置、該調用使用的參數等等返回給彈跳牀。這樣就能夠確保 C 的棧不會不會向上長而可讓循環繼續運行。優化
用 Groovy、Visual Basic .NET、C# 等等支持高階函數的語言實現彈跳牀是可能的[12]。設計
參考連接 :wikiPediacode
尾調用優化htm