1. 程式人生 > >erlang遞迴和尾遞迴

erlang遞迴和尾遞迴

非尾遞迴

sum_1(0) -> 

0;
sum_1(N) ->

sum_1(N-1) + N.

尾遞迴

sum_2(N) ->
sum_2(N,0).
sum_2(0,Sum) -> 
Sum;
sum_2(N,Sum) ->

sum_2(N-1,Sum + N).

遞迴:不斷呼叫自身函式,直到遇見結束條件。

非尾遞迴的流程:以sum_1(N)為例,在N不等於0之前,呼叫sum_1(N-1),棧需要記錄這個點,以便返回計算結果後加上N。

尾遞迴的流程:以sum_2(N)為例,在N不等於0之前,呼叫sum_1(N-1,Sum+N),棧只需要記錄Sum。

尾遞迴優勢:如果N足夠大,可能造成棧溢位,但是兩種遞迴各有優勢,當Sum的資料很複雜,尾遞迴效率就會受到限制,總之具體情況,選擇合適的遞迴。

如何區別:個人的方法是,看函式的返回,如果只有一個值,直接返回,則是尾遞迴,反之為非尾遞迴。

另外:

length(List)會遍歷整個列表,

不建議用在

loop(List)  when length(List) > 0 ->

todo;

loop(List) ->

todo.

時間消耗和List長度成正比,儘量使用 [ ] 匹配區別。