您的位置:首页 > 编程语言

erlang基础练习-编程指南习题部分解答

2012-09-10 09:08 916 查看
-module(letme).
-export([sum/1,sum2/2,lists/1,lists2/1,even/1,filter/2,reverse/1,concatenate/1,flatten/1]).

%编写一个函数sum/1,给定一个正整数N,其返回的是1~N的整数和。
%例如: sum(5) => 15.
sum(1) -> 1;
sum(N) ->
N + sum(N-1).

%编写一个sum/2,函数,给定两个整数N和M,其中N =< M,其返回的是N~M的整数和。如果N>M,进程异常终止。例如 sum(1,3) => 6. sum(6,6) => 6.
sum2(M,M) -> M;
sum2(N,M) when N=<M ->
sum2_2(N,M,0).

sum2_2(M,M,B) -> B+M;
sum2_2(N,M,B) ->
sum2_2(N+1,M,B+N).

%编写一个返回格式为[1,2,3,...N-1,N]的列表的函数。
%例如 create(3) =>[1,2,3].
lists(Number) -> lists(Number,1,[]).
lists(0,_S,L) -> L;
lists(Number,Start,L) ->
lists(Number-1,Start+1,[Number|L]).

%编写一个函数返回格式为[N,N-1,..3,2,1]的列表的函数。
%例如 reverse_create(3) =>[3,2,1].
lists2(Number) -> lists2(1,Number,[]).
lists2(_S,0,L) -> L;
lists2(Start,Number,L) ->
lists2(Start+1,Number-1,[Start|L]).

%编写一个打印出1~N的偶数的函数。
even(N) ->
[X|| X<-lists(N),X rem 2 =:=0].

%编写一个函数,给定一个整数和一个整数列表,并且返回所有小于或等于该整数的整数。
%例如 filter([1,2,3,4,5],3) =>[1,2,3].
filter(L,E) -> filter(L,E,[]).
filter([],E,R) -> reverse(R);
filter([H|T],E,R) ->
case H =:= E of
true -> filter([],E,[H|R]);
false ->filter(T,E,[H|R])
end.

%编写一个函数,给定一个列表,颠倒其中元素的顺序进行排列。
%列如 reverse([1,2,3]) =>[3,2,1].
reverse(L) -> reverse(L,[]).
reverse([],R) -> R;
reverse([H|T],R) -> reverse(T,[H|R]).

%编写一个函数,给定一个列表的列表,将它们连接起来。
%列如 concatenate([[1,2,3],[],[4,five]]) => [1,2,3,4,five].
concatenate([]) -> [];
concatenate(L) -> concatenate_1(L,[]).
concatenate_1([],R) -> reverse(R);
concatenate_1([H|T],R) ->
if
T == [[]] -> concatenate_1([],[H|R]);
T == [] -> concatenate_1([],[H|R]);
T -> concatenate_2(H,T,R)
end.

concatenate_2([],[],R1) -> concatenate_1([],R1);
concatenate_2([],T,R1) -> concatenate_1(T,R1);
concatenate_2([H1|T1],T,R1) ->
concatenate_2(T1,T,[H1|R1]).

%终极实现上面的结果!!!
%列表解析真的很强大!!!
%concatenate(L) ->
%    [X|| Y <- L, Y =/= [],X <-Y].

flatten(L) -> flatten_1(L,length(L)).

flatten_1(L,0) -> L;
flatten_1(L,Num) ->
Result = concatenate(L),
flatten_1(Result,Num-1).

%快速排序
qsort([H|T]) ->
qsort([X||X<-T,X =< T])++[H]++qsort([X||X<-T,X>H]).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: