[erlang-questions] concentate solution well ??
Roelof Wobben
r.wobben@REDACTED
Mon Feb 2 08:02:45 CET 2015
Richard A. O'Keefe schreef op 2-2-2015 om 3:25:
> On 2/02/2015, at 6:27 am, Roelof Wobben <r.wobben@REDACTED> wrote:
>> This solution better ?
>>
>> concatenate([]) ->
>> [].
>>
>> concatenate([List] ) ->
>> concatenate2(List1, []).
>>
>> concatenate2([], List) ->
>> List;
>>
>> concatenate2([Head| Tail], List) ->
>> concatenate2(Tail, [Head | List])
> No., To be honest, it is a b----y bad solution.
>
> WHERE ARE THE [UNPRINTABLE] COMMENTS?
> Because of this thread, I know what concatenate/2
> is supposed to do, BUT YOU HAVE NOT TOLD US WHAT
> concatenat2/2 IS SUPPOSED TO DO.
>
> In fact concatenate2/2 appears to be reversal,
> which is something you definitely do NOT want.
>
> What you have here is
>
> > concatenate([]).
> []
> > concatenate([[a,b,c]]).
> [c,b,a]
> > concatenate([[a,b,c], [1,2,3]]).
> NO MATCH
>
> The basic scheme for processing lists by recursion is
>
> g([H|T], Context) ->
> f(H, g(T, Context), Context);
> g([], Context) ->
> e(Context).
>
> where g is the function we are trying to define
> e is what to do for an empty list
> f is what to do for a non-empty list
> GIVEN the result of a recursive call on the tail.
> e() and f(_,_) do not have to be literal function
> calls; they could be any expression.
>
>
> So we are looking for
>
> concatenate([H|T]) ->
> f(H, concatenate(T));
> concatenate([]) ->
> e().
>
> You know what concatenate([]) is, so we're looking for
>
> concatenate([H|T]) ->
> f(H, concatenate(T));
> concatenate([]) ->
> [].
>
> Now H : list(X)
> concatenate (list(list(X)) -> list(X))
> so concatenate(T) : list(X)
> and you need to find an expression f(A, B)
> such that when A and B are lists, so is f(A, B),
> and the result has all the elements of A followed
> by all the elements of B.
>
> If you really do want a helper function (and there is
> a built-in operator that does *precisely* what you
> need), start by writing the comment:
>
> % concatenate_helper(A : list(X), B : list(X)) -> R : list(X)
> % R is a list containing all the elements of A followed by
> % all the elements of B and nothing else.
>
> By this point in the book, if you haven't heard of the built-in
> operator that does this, you have probably written your own
> function for it already.
>
>
>
Thanks,
Now Im doubt or looking for a erlang book which takes lesser steps and
explain things like recursion in smaller steps or that Erlang is not
the language for me.
Roelof
More information about the erlang-questions
mailing list