【发布时间】:2015-02-12 02:29:29
【问题描述】:
我正在阅读http://learnyousomeerlang.com/,其中包括一个尾部递归子列表函数,该函数可以反转列表以保持顺序。我写了一个不需要反向调用的替代方案。我的效率更高(当然更冗长,但我不关心),还是我忽略了一些东西?
-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;dr: 不。但不要灰心——你问的正是正确的问题类型,并在代码中进行了正确的实验,以真正从你的自我中获得一些东西——学习。这是一件很棒的事情!
标签: erlang