erlang练习题(二)

题目一

替换元组或列表中指定位置的元素,新元素作为参数和列表或元组一起传入函数内

解答

erlang 复制代码
replaceIdx(List, Index, Val) ->

 replaceIdx(List, Index, Val, 1, []).


replaceIdx([], _, _, _, Acc) ->

 lists:reverse(Acc);

%% 到达替换位置的处理

replaceIdx([_ | Rest], Index, Val, Index, Acc) ->

 io:format("[~p]~n", [[Val | Acc]]),

 replaceIdx(Rest, Index, Val, Index + 1, [Val | Acc]);

 

replaceIdx([Element | Rest], Index, Val, CurrentIndex, Acc) ->

 io:format("[~p]~n", [[Element | Acc]]),

 replaceIdx(Rest, Index, Val, CurrentIndex + 1, [Element | Acc]).

题目二

指定列表第几位之后的数据进行反转。如:指定[2,3,5,6,7,2]第3位后进行反转

解答

erlang 复制代码
%% 和并两个列表 
merge_list(List1, List2) ->
	merge_list(List1, List2, []).

merge_list([], [], Acc) -> lists:reverse(Acc);
merge_list([H | T], List2, Acc) ->
	merge_list(T, List2, [H | Acc]);
merge_list([], [H | T], Acc) ->
	merge_list([], T, [H | Acc]).

%% 指定列表第几位之后的数据进行反转。如:指定[2,3,5,6,7,2]第3位后进行反转为 [2,3,5,2,7,6] 
reverse_n(List, N) ->
	Sublist = lists:sublist(List, N + 1, length(List) - N),
	NewSublist = lists:reverse(Sublist),
	merge_list(lists:sublist(List, 3), NewSublist).

题目三

对列表进行过滤,输出列表所有的奇数和偶数

解答

erlang 复制代码
filteroe(List) ->

 Odds = [X || X<-List, X rem 2 /= 0],

 Evens = [X || X<-List, X rem 2 == 0],

 io:format("Odds = ~p ~nEvens = ~p ~n", [Odds, Evens]).

题目四

使用匿名函数对列表进行过滤,输出列表所有的奇数和偶数(可以使用API)

解答

erlang 复制代码
filter_odd_even(List) ->

 Odds = lists:filter(fun(X) -> X rem 2 /= 0 end, List),

 Evens = lists:filter(fun(X) -> X rem 2 =:= 0 end, List),

 {Odds, Evens}.

题目五

对数字列表或者元组中所有的奇数进行求和

解答

erlang 复制代码
sum_odd(List) ->

 lists:sum([X || X<- List, X rem 2 /= 0]).

题目六

对数字列表或元组,输出所有偶数乘以它在此列表或元组中的偶数位数

比如在列表[3,4,8,9,7,2,5]中8所在此列表中的偶数位数为2,2所在此元组中的偶数位数为3

解答

erlang 复制代码
get_evens_mul_Idx(List) ->

 get_evens_mul_Idx(List, 1, []).

 

%% 递归终止

get_evens_mul_Idx([], _, Acc) -> lists:reverse(Acc);

 

%% 处理遇到偶数的情况

get_evens_mul_Idx([Value | Rest], Index, Acc) when Value rem 2 == 0 ->

 get_evens_mul_Idx(Rest, Index + 1, [Value * Index | Acc]);

 

%% 非偶数的情况,下标增加,其他不变

get_evens_mul_Idx([_ | Rest], Index, Acc) ->

 get_evens_mul_Idx(Rest, Index + 1, Acc).

题目七

将指定的元素插入到列表或元组中指定的位置,列表或元组中后面的元素依次向后挪动

解答

erlang 复制代码
insert_at(List, Index, Val) ->

 insert(List, Index, Val, 1, []).

 
insert([], _, _, _, Acc) -> lists:reverse(Acc);

%% 处理Index之前的元素,原样插入

insert([Value | Rest], Index, Val, CurIdx, Acc) when CurIdx /= Index ->

 insert(Rest, Index, Val, CurIdx + 1, [Value | Acc]);


%% 到达插入位置的处理

insert(List, Index, Val, Index, Acc) ->

 insert(List, Index, Val, Index + 1, [Val | Acc]).

题目八

用列表输出在列表或元组中查找到的的所有重复元素

解答

erlang 复制代码
find_dup(Items) ->

 find_dup(Items, []).


find_dup([], Duplicates) ->

 Duplicates;

%% Acc 是用来存储重复值只存一次

find_dup([Item | Rest], Acc) ->

 case lists:member(Item, Rest) and not lists:member(Item, Acc) of % 如果答案集合已经存在了重复元素,就不要加入

  true -> find_dup(Rest, [Item | Acc]);

  false -> find_dup(Rest, Acc)

 end.

题目九

删出列表或元组中的所有重复元素

解答

erlang 复制代码
%% 思路:就是把元素加入到新的列表中,重复的不加入 0

delete_dup(Items) ->

  delete_dup(Items, []).


delete_dup([], Acc) -> Acc;

delete_dup([Item | Rest], Acc) ->

 case lists:member(Item, Acc) of % 元素没有出现在结果集中就加入

  false -> delete_dup(Rest, [Item | Acc]);

  true -> delete_dup(Rest, Acc)

 end.

题目十

使用冒泡排序对列表进行排序(升序)

解答

erlang 复制代码
%% 取列表头作为最大值和

bubble_sort(List) ->

 bubble_sort(List, length(List)).


bubble_sort(List, 0) -> List; % 当迭代次数为 0 时,排序完成

bubble_sort(List, N) ->

 SortedList = bubble_pass(List, N), % 对列表进行下一趟冒泡,一个元素到达最终位置

 bubble_sort(SortedList, N - 1). % 递归的进行下一趟冒泡


bubble_pass([X, Y | Rest], N) when X > Y ->

 [Y | bubble_pass([X | Rest], N - 1)]; % 如果 X > Y 就交换他们

bubble_pass([X | Rest], N) ->

 [X | bubble_pass(Rest, N - 1)]; % 否则位置保持不变

bubble_pass([], _) -> [].
相关推荐
CT随4 分钟前
Redis内存碎片详解
java·开发语言
anlog13 分钟前
C#在自定义事件里传递数据
开发语言·c#·自定义事件
奶香臭豆腐26 分钟前
C++ —— 模板类具体化
开发语言·c++·学习
晚夜微雨问海棠呀34 分钟前
长沙景区数据分析项目实现
开发语言·python·信息可视化
graceyun34 分钟前
C语言初阶习题【9】数9的个数
c语言·开发语言
波音彬要多做1 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
Swift社区1 小时前
Excel 列名称转换问题 Swift 解答
开发语言·excel·swift
一道微光1 小时前
Mac的M2芯片运行lightgbm报错,其他python包可用,x86_x64架构运行
开发语言·python·macos
矛取矛求1 小时前
QT的前景与互联网岗位发展
开发语言·qt
Leventure_轩先生1 小时前
[WASAPI]从Qt MultipleMedia来看WASAPI
开发语言·qt