【发布时间】:2015-03-23 18:37:08
【问题描述】:
我一直在学习 Erlang,并尝试完成一些练习功能。我特别努力地制作一个函数,并认为这可能是因为我对“Erlang”的思考不够。
有问题的函数接受一个列表和一个子列表大小,然后生成一个元组列表,其中包含子列表之前的元素数量、子列表本身以及子列表之后的元素数量。例如
sublists(1,[a,b,c])=:=[{0,[a],2}, {1,[b],1}, {2,[c],0}].
sublists(2,[a,b,c])=:=[{0,[a,b],1}, {1,[b,c],0}].
我的工作解决方案是
sublists(SubListSize, [H | T]) ->
Length = length(1, T),
sublists(SubListSize, Length, Length-SubListSize, [H|T], []).
sublists(_, _, -1, _, Acc) -> lists:reverse(Acc);
sublists(SubSize, Length, Count, [H|T], Acc) ->
Sub = {Length-SubSize-Count, grab(SubSize, [H|T],[]),Count},
sublists(SubSize, Length, Count-1, T, [Sub|Acc]).
length(N, []) -> N;
length(N, [_|T]) -> length(N+1, T).
grab(0, _, Acc) -> lists:reverse(Acc);
grab(N, [H|T], Acc) -> grab(N-1, T, [H|Acc]).
但感觉不对劲,我想知道是否有更好的方法?
有一个扩展要求使用列表推导重新实现子列表功能。我的失败尝试是
sublist_lc(SubSize, L) ->
Length = length(0, L),
Indexed = lists:zip(L, lists:seq(0, Length-1)),
[{I, X, Length-1-SubSize} || {X,I} <- Indexed, I =< Length-SubSize].
据我了解,列表推导式无法预见,因此我无法使用之前的抓取功能。这再次让我觉得必须有更好的方法来解决这个问题。
【问题讨论】:
标签: functional-programming erlang