線性遞迴:
fac(0) -> 1 ;
fac(n) -> n*fac(n-1).
尾遞迴:
fac(0,sum) ->
sum;
fac(n,sum) ->
fac(n-1,sum*n).
尾遞迴定義:
函式最後一步呼叫自身,即最後一行**一定是對於自己的乙個遞迴呼叫。
erlang尾遞迴這樣帶來的好處是可以讓編譯器做到將遞迴優化,轉化為跳轉指令而不是,可以防止棧空間**。
尾遞迴通常的做法是將中間狀態加入到引數中,還可以防止共享變數的問題。這也是傳說中的中間狀態
python中對於尾遞迴的優化我還不得而知,erlang對於線性遞迴做到了一定的優化,gcc也可以。
想去買一本《遞迴可列舉度與圖靈度》
遞迴和尾遞迴
c語言中編譯預處理的三種形式的命令 巨集定義,檔案包含,條件編譯命令。1 巨集定義主要是 define,undef 如下 define pi 3.1415926 不帶引數的巨集定義 define max a,b a b?a b 帶引數的巨集定義 說明 巨集定義在c語言與c 語言中是相通的。下面舉例說...
原 關於線性遞迴與尾遞迴
作為讀書筆記使用 線性遞迴 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尾遞迴這樣帶來的好處是可以讓編...
遞迴 尾遞迴
階乘函式 n n n 1 n 2 3 2 1 針對這樣的表述,直譯成乙個過程 define factorial n if n 1 1 n factorial n 1 如果是factorial 6 其計算行為是 factorial 6 6 factorial 5 6 5 factorial 4 6 5...