我在閱讀http://learnyousomeerlang.com/其中包括一個尾部遞歸子列表函數,它顛倒了列表以保持順序。我寫了一個不需要反向調用的替代方案。我的效率是否更高(當然更詳細,但我不關心)或者我忽略了一些東西?Erlang子列表函數的性能
-module(sublist).
-export([sublist/2,sublistR/2]).
-include_lib("eunit/include/eunit.hrl").
sublist(_,0) ->
[];
sublist([],_) ->
[];
sublist(List,Length) ->
sublist([hd(List)], tl(List), Length-1).
sublist(Acc,[],_) ->
Acc;
sublist(Acc,_,0) ->
Acc;
sublist(Acc,Tail,Length) ->
sublist(Acc++[hd(Tail)], tl(Tail), Length-1).
sublistR(L, N) -> lists:reverse(sublistR(L, N, [])).
sublistR(_, 0, SubList) -> SubList;
sublistR([], _, SubList) -> SubList;
sublistR([H|T], N, SubList) when N > 0 ->
sublistR(T, N-1, [H|SubList]).
sublist_test() ->
sublisttest(fun sublist:sublist/2),
sublisttest(fun sublist:sublistR/2).
sublisttest(SublistFunc) ->
[] = SublistFunc([],10),
[] = SublistFunc([1,2,3], 0),
[1,2,3] = SublistFunc([1,2,3],3),
[1,2,3] = SublistFunc([1,2,3],4),
[1,2] = SublistFunc([1,2,3],2).
TL;博士:不可以,但不要失去心臟 - 你所要求的準確正確的問題,並在代碼中進行正確的實驗以真正實現計算出你的自學。這是一件好事! – zxq9 2014-12-13 14:48:44