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([], _) -> [].
相关推荐
Cloud_Shy6188 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
天佑木枫34 分钟前
15天Python入门系列 · 序
开发语言·python
宋拾壹2 小时前
同时添加多个类目
android·开发语言·javascript
凡人叶枫2 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
小小龙学IT2 小时前
Go 语言后端开发:从并发模型到生产落地的工程实践
开发语言·后端·golang
ytttr8733 小时前
Qt 数字键盘实现
开发语言·qt
wearegogog1233 小时前
C# .NET 文件比较工具 WinForms
开发语言·c#·.net
再写一行代码就下班3 小时前
Cursor配置Java环境、创建Spring Boot项目的步骤
java·开发语言·spring boot
零陵上将军_xdr3 小时前
后端转全栈学习-Day5-JavaScript 基础-3
开发语言·javascript·学习
oqX0Cazj23 小时前
2026超火Go-Zero实战:从架构原理到高并发接口落地,彻底解决接口超时、雪崩问题
开发语言·架构·golang