在Erlang中列出一个嵌套列表 [英] Flatten a list of nested lists in Erlang

查看:135
本文介绍了在Erlang中列出一个嵌套列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



问题是


编写一个函数,给定一个嵌套列表的列表,将返回一个平面列表。


示例:
flatten([[1,[2,[3],[]]],[[[4]]],[5,6]])⇒[提示:使用


连接来解决 flatten


此处是我的连接功能

  %% concatenate([[1,2 ,3],[],[4,五]])⇒[1,2,3,4,5]。 
连接([X | Xs]) - > concat(X,Xs,[])。
concat([X | Xs],T,L) - > concat(Xs,T,[X | L]);
concat([],[X | Xs],L) - >连接(X,Xs,L);
concat([],[],L) - >反向(L)。

我真的想知道一个优雅的方式来实现 flatten 。我花了几个小时解决这个练习。



更新:我忘记了最重要的先决条件。只有递归模式匹配可以解决这个问题吗?

解决方案

p>我会尝试这种方式

  flatten(X) - >列表:反向(变平(X,[]))。 

flatten([],Acc) - >加速;
flatten([H | T],Acc)when is_list(H) - >扁平(T,扁平(H,Acc));
flatten([H | T],Acc) - >变平(T,[H |度Acc])。

测试

  my:flatten([[1,[2,[3],[]]],[[[4]]],[5,6]])。 
[1,2,3,4,5,6]

UPD :或者这样,没有保护和反向,只有递归调用和模式匹配。

  flatten(X) >变平(X,[])。 

flatten([],Acc) - >加速;
flatten([[] | T],Acc) - >扁平(T,Acc);
flatten([[_ _ _] = H | T],Acc) - >扁平(T,扁平(H,Acc));
flatten([H | T],Acc) - >扁平化(T,Acc ++ [H])。


I'm working on the exercises in Erlang Programming.

The question is

Write a function that, given a list of nested lists, will return a flat list.

Example: flatten([[1,[2,[3],[]]], [[[4]]], [5,6]]) ⇒ [1,2,3,4,5,6].

Hint: use concatenate to solve flatten.

And here is my concatenate function

%% concatenate([[1,2,3], [], [4, five]]) ⇒ [1,2,3,4,five].
concatenate([X|Xs]) -> concat(X, Xs, []).
concat([X|Xs], T, L) -> concat(Xs, T, [X|L]);
concat([], [X|Xs], L) -> concat(X, Xs, L);
concat([], [], L) -> reverse(L).

I really want to know an elegant way to implement flatten. I've spent hours solving this exercise.

UPDATE: I forget most important prerequisite. Is it possible solving this problem with only recursion and pattern matching?

解决方案

I would try this way

flatten(X) -> lists:reverse(flatten(X,[])).

flatten([],Acc) -> Acc;
flatten([H|T],Acc) when is_list(H) -> flatten(T, flatten(H,Acc));
flatten([H|T],Acc) -> flatten(T,[H|Acc]).

testing

my:flatten([[1,[2,[3],[]]], [[[4]]], [5,6]]).
[1,2,3,4,5,6]

UPD: or this way, without guards and reverse, only recursive calls and pattern matching.

flatten(X)               -> flatten(X,[]).

flatten([],Acc)          -> Acc;
flatten([[]|T],Acc)      -> flatten(T, Acc);
flatten([[_|_]=H|T],Acc) -> flatten(T, flatten(H,Acc));
flatten([H|T],Acc)       -> flatten(T,Acc++[H]) .

这篇关于在Erlang中列出一个嵌套列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆