在計算機程序設計中,尾部調用是程序源代碼中的一種特殊情況,在這種情況下,函數、子例程或過程通過調用另一個函數而不是簡單地傳遞一個保存返回值的變量來返回一個期望值調用它以提供返回值的函數的結尾或尾部。一些程序...
在計算機程序設計中,尾部調用是程序源代碼中的一種特殊情況,在這種情況下,函數、子例程或過程通過調用另一個函數而不是簡單地傳遞一個保存返回值的變量來返回一個期望值調用它以提供返回值的函數的結尾或尾部。一些程序員對尾部調用感興趣,因為在某些優化或編譯器行為下,沒有額外的堆棧空間用于存儲主函數的代碼位置;相反,tail函數用于生成返回值報告,直接返回到調用原始函數的調用點。在使用遞歸的情況下,使用尾部調用特別有用,因為在遞歸調用嵌套的情況下,用于存儲調用方地址的堆棧空間量雖然使用尾部調用有助于提高程序的速度、內存使用率和效率,但它也可能導致源代碼被重組以使調試和跟蹤變得困難的情況,尤其是在遞歸的情況下尾調用的存在很大程度上是由于調用堆棧在大多數計算機程序和系統結構中的工作方式。堆棧就像一堆板,是一種先進后出的數據結構。當調用函數、子程序或過程時,調用的地址稱為堆棧幀這意味著一個調用函數a,然后調用函數B的程序將有兩個堆棧幀,一個用于函數B,另一個用于函數a函數B執行完畢后,它的堆棧幀從棧頂彈出,執行返回到函數A,當它完成時,它的幀從堆棧中彈出,最后將程序控制返回到最初調用第一個函數的點。當使用尾部調用時,函數中的return語句直接使用另一個函數的返回值作為發送給調用代碼的數據,在上面的例子中,如果函數A用return語句直接調用函數B,那么就形成了一個尾部調用,在調用堆棧中,函數B將接收返回地址,而不是函數A和函數B都有堆棧幀從函數A和函數A的堆棧幀將彈出并處理,這意味著函數B將直接將其返回值傳遞回調用函數A的位置,而不必首先將控制權傳遞回函數A。這將提高函數調用的速度,并有助于減少堆棧中的信息量。尾部調用的屬性可以使它們成為非常有吸引力的選項遞歸函數。遞歸函數是一個重復調用自身以計算值的函數,遍歷列表數據結構時就是這樣。嵌套函數調用不會創建額外的堆棧幀,因此,可以安全地執行非常深層次的遞歸,而不會立即面臨堆棧溢出和可能的程序終止的威脅
-
發表于 2020-08-07 21:19
- 閱讀 ( 710 )
- 分類:電腦網絡