erlang练习题

文章目录

资料

erlong 中文手册

阔以用来查找erlong的库函数的用法:erlong 中文手册

一些不同(keng)

1

好像if后面的判断条件(guard关卡)不能是函数,case后的就行

1、将列表中的integer,float,atom转成字符串并合并成一个字个字符串:[1,a,4.9,“sdfds”] 结果:“1a4.9sdfds”(禁用++ – append concat实现)

erl文件

-module(lpfmerge).
-export([getstr/1,to_string/1]).

getstr([])->"";
getstr([H|T])->
	if
		is_atom(H)->[atom_to_list(H)|getstr(T)];
		is_integer(H)->[integer_to_list(H)|getstr(T)];
		is_float(H)->[float_to_list(H,[{
   decimals,1}])|getstr(T)];	%注意这里小数点保留一位
		is_list(H)->[H|getstr(T)]
	end.
	
to_string(L)->binary_to_list(list_to_binary(getstr(L))).

最后一句就是先转换成 二进制文件 然后再转换回list,不然就会成下面第四个运行代码那样是分开的

输入erlong shell测试

PS D:\lpf\lpf练习题\未完成\1> erl

Eshell V8.3  (abort with ^G)
1> c(lpfmerge).
{
   ok,lpfmerge}
2> L=[1,a,4.9,"sdfds"].
[1,a,4.9,"sdfds"]
3> lpfmerge:to_string(L).
"1a4.9sdfds"
4> lpfmerge:getstr(L).
["1","a","4.9","sdfds"]
5>

2、得到列表或元组中的指定位的元素 {a,g,c,e} 第1位a [a,g,c,e] 第1位a(禁用erlang lists API实现)

erl文件

先用2个参数的把元组都统一弄成列表 然后再处理

-module(q2).
-export([getPosVal/2]).

getPosVal([],Pos)->[];		%列表为空
getPosVal({
   },Pos)->{
   };		%元组为空
getPosVal(L,Pos)->
	if
		is_tuple(L)->
			getPosVal(tuple_to_list(L),Pos);	%如果是元组,就先转换成列表
		true->
			getPosVal(L,Pos,1)
	end.
	
getPosVal([H|T],Pos,Index)when Pos==Index->H;
getPosVal([H|T],Pos,Index)->getPosVal(T,Pos,Index+1).

输入erlong shell测试

PS D:\lpf\lpf练习题\已完成\2> erl
Eshell V10.7  (abort with ^G)
1> c(q2).
q2.erl:4: Warning: variable 'Pos' is unused
q2.erl:5: Warning: variable 'Pos' is unused
q2.erl:14: Warning: variable 'T' is unused
q2.erl:15: Warning: variable 'H' is unused
{
   ok,q2}
2> L=[10,20,30,40,50,60].
[10,20,30,40,50,60]
3> q2:getPosVal(L,3).
30
4>

3、根据偶数奇数过淲列表或元组中的元素(禁用API实现)

erl文件

-module(lpffilter).
-export([filter/1]).


filter([])->[];
filter({
   })->{
   };
filter([H|T])->
	if
		is_tuple(H)
			->filter(tuple_to_list(H)); %之前写成  ->filter([tuple_to_list(H)|T]);就不对,为啥喃?
	 
		(H rem 2)=:=0 
			->[H|filter(T)];
	true 
		->filter(T)
	end.

输入erlong shell测试

PS D:\lpf\lpf练习题\已完成\3> erl
Eshell V8.3  (abort with ^G)
1> c(lpffilter).
{
   ok,lpffilter}
2> L=[1,2,3,4,5,6,7,8,{
   9,10,11,12},13,14,15,16].
[1,2,3,4,5,6,7,8,{
   9,10,11,12},13,14,15,16]
3> lpffilter:filter(L).
[2,4,6,8,10,12]
4>

4、便用匿名函数对列表奇数或偶数过淲

erl文件

-module(q4).
-export([filter/2]).
	
filter(F,[H|T])->
	case F(H) of
		true->[H|filter(F,T)];
		false->filter(F,T)
	end;
filter(F,[])->[].

输入erlong shell测试

PS D:\lpf\lpf练习题\已完成\4> erl
Eshell V10.7  (abort with ^G)
1> c(q4).
q4.erl:16: Warning: variable 'F' is unused
{
   ok,q4}
2> L=[1,2,3,4,5,6,7,8].
[1,2,3,4,5,6,7,8]
3> F=fun(X)->(X rem 2) =:=0 end.
#Fun<erl_eval.7.126501267>
4> q4:filter(F,L).
[2,4,6,8]
5>

5、计算数字列表[1,2,3,4,5,6,7,8,9]索引N到M的和

erl文件

我是写的for循环来做的,计算的是 [ I , J ) [I,J) [I,J) 左闭右开区间的和

用if判断:

-module(lpffor).
-export([for/4]).

for(Index,I,J,[H|T])->
	if 
		(Index>=I) and (Index<J)
			->H+for(Index+1,I,J,T);
	true 
		->for(Index+1,I,J,T)
	end;
for(Index,I,J,[])->0.

用 when 判断:

-module(lpffor).
-export([for/4]).

for(Index,I,J,[H|T]) when (Index>=I) , (Index<J)
	->H+for(Index+1,I,J,T);
for(Index,I,J,[H|T]) 
	->for(Index+1,I,J,T);
for(Index,I,J,[])
	->0.

输入erlong shell测试

PS D:\lpf\lpf练习题\未完成\5> erl
Eshell V8.3  (abort with ^G)
1> c(lpffor).
lpffor.erl:11: Warning: variable 'I' is unused
lpffor.erl:11: Warning: variable 'Index' is unused
lpffor.erl:11: Warning: variable 'J' is unused
{
   ok,lpffor}
2> L=[10,20,30,40,50,60,70,80,90].
[10,20,30,40,50,60,70,80,90]
3> lpffor:for(1,2,7,L).
200
4>

6、查询List1是为List2的前缀(禁用string API实现)

erl文件

这是看的别人的代码,原来export中只写在外面调用的函数就行,里面用到的其他函数可以不写,比如这里用了is_prefix2

还有就是,要想对列表操作的话,参数就要写成,(H|T)这种,这样写的话又不能表示整体的这个列表了,所以这里要弄两个

-module(q6).
-export([is_prefix/2]).

is_prefix([], L2) -> false;
is_prefix([], []) -> false;
is_prefix(L1, L2) ->
	if
		length(L1) >= length(L2) 
			-> false;
		true 
			-> is_prefix2(L1,L2)
end.

is_prefix2([H1|T1],[H2|T2]) ->
	if
		(H1 == H2 andalso T1 == [] ) 
			-> true;
		H1 == H2  
			-> is_prefix2(T1,T2);
		H1 /= H2 
			-> false;
		T1 == [] 
			-> true
	end.

输入erlong shell测试

PS D:\lpf\lpf练习题\未完成\6> erl
Eshell V8.3  (abort with ^G)
1> c(q6).
q6.erl:4: Warning: variable 'L2' is unused
q6.erl:5: Warning: this clause cannot match because a previous clause at line 4 always matches
{
   ok,q6}
2> L1=[1,2,3].
[1,2,3]
3> L2=[1,2,3,4,5].
[1,2,3,4,5]
4> L3=[2,3,4].
[2,3,4]
5> q6:is_prefix(L1,L2).
true
6>

7、逆转列表或元组(禁用lists API实现)

erl文件

-module(lpfReverse).
-export([lpfreverse/1,lpfreverse/2]).

lpfreverse(L)->lpfreverse(L,[]).
lpfreverse([H|T],Reversed)->lpfreverse(T,[H|Reversed]);
lpfreverse([],Reversed)->Reversed.

输入erlong shell测试

PS D:\lpf\lpf练习题\未完成\7> erl
Eshell V8.3  (abort with ^G)
1> c(lpfReverse).
{
   ok,lpfReverse}
2> L=[1,3,5,7,9].
[1,3,5,7,9]
3> lpfReverse:lpfreverse(L).
[9,7,5,3,1]
4>

8、对列表进行排序

erl文件

书上的快排例子,erlong写快排好简洁呀ヽ( ̄▽ ̄)ノ

-module(lpfsort).
-export([sort/1]).

sort([])->[];
sort([Mid|T])
	->sort([X||X<-T , X<Mid]) ++ [Mid] ++ sort([X||X<-T , X>=Mid]).

9、对数字列表进行求和再除以指定的参数,得到商余

erl文件

-module(q9).
-export([get_sum_rem/2]).

get_sum_rem(L,Num)
	->{
   sum(L)/Num,sum(L) rem Num}.

sum([H|T])->H+sum(T);
sum([])->0.


输入erlong shell测试

PS D:\lpf\lpf练习题\未完成\9> erl
Eshell V8.3  (abort with ^G)
1> c(q9).
q9.erl: no such file or directory
error
2> c(q9).
{
   ok,q9}
3> L=[10,20,30,40,50].
[10,20,30,40,50]
4> q9:get_sum_rem(L,7).
{
   21.428571428571427,3}
5> 150/7.
21.428571428571427
6>

10、获得当前的堆栈???

这个是直接在shell里写

大概就是写一个会产生错误的函数,比如 generate_exception(1),因为看下面错误信息的第一行 shell_undef ,意思是没有定义这个函数

然后就会报错,调用get_stacktrace()就能得到栈的信息了

PS D:\lpf\lpf练习题\未完成\10> erl
Eshell V8.3  (abort with ^G)
1> try generate_exception(1)
catch
error:X->
{
   X,erlang:get_stacktrace()}

end.
{
   {
   shell_undef,generate_exception,1,[]},
 [{
   shell,shell_undef,2,[{
   file,"shell.erl"},{
   line,1061}]},
  {
   erl_eval,local_func,6,[{
   file,"erl_eval.erl"},{
   line,562}]},
  {
   erl_eval,try_clauses,8,[{
   file,"erl_eval.erl"},{
   line,904}]},
  {
   shell,exprs,7,[{
   file,"shell.erl"},{
   line,686}]},
  {
   shell,eval_exprs,7,[{
   file,"shell.erl"},{
   line,641}]},
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值