作為讀書筆記使用:
線性遞迴:
1 fac(0) -> 1;2 fac(n) -> n*fac(n-1).
尾遞迴:
1 fac(0,sum) ->2sum;
3 fac(n,sum) ->
4 fac(n-1,sum*n).
尾遞迴定義:
函式最後一步呼叫自身,即最後一行**一定是對於自己的乙個遞迴呼叫。
erlang尾遞迴這樣帶來的好處是可以讓編譯器做到將遞迴優化,轉化為跳轉指令而不是,可以防止棧空間**。
尾遞迴通常的做法是將中間狀態加入到引數中,還可以防止共享變數的問題。這也是傳說中的中間狀態
python中對於尾遞迴的優化我還不得而知,erlang對於線性遞迴做到了一定的優化,gcc也可以。
想去買一本《遞迴可列舉度與圖靈度》
尾遞迴和線性遞迴
線性遞迴 fac 0 1 fac n n fac n 1 尾遞迴 fac 0,sum sum fac n,sum fac n 1,sum n 尾遞迴定義 函式最後一步呼叫自身,即最後一行 一定是對於自己的乙個遞迴呼叫。erlang尾遞迴這樣帶來的好處是可以讓編譯器做到將遞迴優化,轉化為跳轉指令而不是...
遞迴與尾遞迴
1 遞迴 關於遞迴的概念,我們都不陌生。簡單的來說遞迴就是乙個函式直接或間接地呼叫自身,是為直接或間接遞迴。一般來說,遞迴需要有邊界條件 遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進 當邊界條件滿足時,遞迴返回。用遞迴需要注意以下兩點 1 遞迴就是在過程或函式裡呼叫自身。2 在使用遞迴策略時...
遞迴與尾遞迴
1 遞迴 簡單的來說遞迴就是乙個函式直接或間接地呼叫自身,是為直接或間接遞迴。一般來說,遞迴需要有邊界條件 遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進 當邊界條件滿足時,遞迴返回。用遞迴需要注意以下兩點 1 遞迴就是在過程或函式裡呼叫自身。2 在使用遞迴策略時,必須有乙個明確的遞迴結束條件...