尾遞迴和線性遞迴

2021-06-16 12:23:59 字數 407 閱讀 5257

線性遞迴:

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...