Lua程序設計 函數 正確的尾調用

            Lua中的「尾調用」就是一種相似於goto的函數調用,當一個函數調用是另外一個函數的最後一個動做時,該調用纔算是一條「尾調用」。【一個函數在調用完另外一個函數以後,是否就無其餘事情須要作了】函數

function f(x) return g(x) end
  也就是說,當f調用完g以後,f所表明的整個函數的調用纔算執行完成也就無其餘事情可作了。所以,這種狀況中,程序就不須要返回那個「尾調用」所在的函數了。
因此在「尾調用」以後,程序也不須要保存任何關於該函數的棧信息了。
 當g返回時,執行控制權能夠直接返回到調用f的那個點上。

            Lua中進行「尾調用」時不耗費任何棧空間。因此一個程序能夠擁有無數嵌套的「尾調用」。lua

function foo(n) 
  if n > 0 then return foo(n - 1) end
end
調用以上函數時,傳入任何數字做爲參數都不會形成棧溢出。

        如下示例均不是「尾調用」spa

 return g(x) + 1 ----必須作一次加法。
 return x or g(x) ----必須調整爲一個返回值。
return (g(x))   ----必須調整爲一個返回值。
調用完一個函數以後就無需作其餘事情了。

         在Lua中,只有「return <func> (<args>)」這樣的調用形式纔算是一條「尾調用」,Lua會在調用前對<func>及其參數求值,因此它們能夠是任意複雜的表達式。code

return x[i].foo(x[j] + a*b, i+j)

        Lua中「尾調用」的一大應用就是編寫「狀態機」。這種程序一般以一個函數來表示一個狀態,改變狀態就是goto到另外一個特定的函數。io

相關文章
相關標籤/搜索