erlang尾递归练习
1 %%计算链表长度尾递归实现
2 lez(N) -> lez(N, 0).
3
4 lez([], Acc) -> Acc;
5 lez([_ | T], Acc) -> lez(T, Acc + 1).
6
%% 将某个元素重复n次返回一个链表 dulicate(0,_) ->[];
dulicate(N,DATA) -> [X | dulicate(N-1,X)]. %% 尾递归版本 my_duplicate(ARG,DATA) -> my_duplicate_a(ARG,DATA,[]).
my_duplicate_a(0,_,RESULT) -> RESULT;
my_duplicate_a(ARG,DATA,RESULT)-> my_duplicate_a(ARG-1,DATA,[DATA | RESULT]). 21
22 %%翻转一个链表
23
24 zreverse_list([]) -> [];
25 zreverse_list([X|REST]) -> [zreverse_list(REST)|[X]]
26
27 %%尾递归版本
28 tail_reverse_list(N)->reverse_list(N,[]).
29 reverse_list([],ACC) -> ACC;
30 reverse_list([X|REST],ACC) -> reverse_list(REST,[X|ACC]).
31
32 %%获取一个链表的前N项,如果N大于链表长度,返回整个链表
33
34 sublist([], _) -> [];
35 sublist(X, N) when N < 0 -> [];
36 sublist(X, N) when N =:= 0 -> [];
37 sublist([X | REST], N) -> [X | sublist(REST, N - 1)].
38
39 %%尾递归版本
40
41 rsublist(N, X) -> zsublist(N, X, []).
42 zsublist([], _, ACC) -> ACC;
43 zsublist(X, N, ACC) when N < 0 -> ACC;
44 zsublist(X, N, ACC) when N =:= 0 -> ACC;
45 zsublist([X | REST], N, ACC) -> zsublist(REST, N - 1, ACC++[X]).
46
47
48 %%合并两个链表,两个链表每取出一项组成元祖 最后返回一个链表 eg: [1,2],[a,b] => [{1,a},{2,b}]
49
50 zzip([], _) -> [];
51 zzip(_, []) -> [];
52 zzip([], []) -> [];
53 zzip([X | RE], [Y | ST]) -> [{X, Y} | zzip(RE, ST)].
54
55 %%尾递归版本
56 tail_zzip(X, Y) -> rzzip(X, Y, []).
57
58 rzzip([], _, ACC) -> ACC;
59 rzzip(_, [], ACC) -> ACC;
60 rzzip([], [], ACC) -> ACC;
61 rzzip([X | RE], [Y | ST], ACC) -> rzzip(RE, ST, ACC ++ [{X, Y}]).
erlang尾递归练习的更多相关文章
- erlang尾递归的概括
网上看了些,自己总结了下 .没有局部变量,否则会爆栈 .递归函数的参数里面,至少有一个用来作为循环,另外一个一般用来保存临时结果,两者一起形成循环
- about python
函数式编程 λ演算 LISP,Erlang 尾递归 栈的使用 避免防御式编程 ER实体Entity关系relationship OOP [OOA/D] 属性.行为 继承.聚合.关联 抽象.封装 笛卡尔 ...
- [Erlang 0120] Know a little Core Erlang
Erlang开发者或多或少都用过或者听说过Core erlang,它是什么样的呢?新建一个测试模块a.erl,如下操作会生成core erlang代码而非a.beam: Eshell V6.0 ...
- [Erlang 0116] 当我们谈论Erlang Maps时,我们谈论什么 Part 1
Erlang 增加 Maps数据类型并不是很突然,因为这个提议已经进行了2~3年之久,只不过Joe Armstrong老爷子最近一篇文章Big changes to Erlang掀起不小了风 ...
- Erlang error handling
Erlang error handling Contents Preface try-catch Process link Erlang-way error handling OTP supervis ...
- Erlang 初学者技巧及避免的陷阱
1. 传参或在匿名函数内慎用self() 通常在做消息传递或新建进程的时候我们需要将当前进程的Pid发给目标进程以便接收返回信息,但初学者不留意容易犯以下错误 spawn(fun() -> lo ...
- Erlang初学
这篇文章主要介绍了Erlang初学:Erlang的一些特点和个人理解总结,本文总结了函数式编程.一切都是常量.轻量进程.进程端口映射及典型缺点等内容,需要的朋友可以参考下 我对 Erlang 编程理念 ...
- erlang note
没有关于erlang interface ,继续寻找吧... --------------------------------------------------------------- erl - ...
- Erlang 102 Erlang并发编程
笔记系列 Erlang环境和顺序编程Erlang并发编程Erlang分布式编程YawsErlang/OTP 日期 变更说明 2014-11-02 A outline 2014 ...
随机推荐
- typescript 自动编译 生成js文件
项目文件 <?xml version="1.0" encoding="utf-8"?><Project ToolsVersion=" ...
- How to generate HMAC-SHA1 in C#?
using (HMACSHA1 m = new HMACSHA1(Encoding.UTF8.GetBytes("AKIDZfbOA78asKUYBcXFrJD0a1ICvR98JM&quo ...
- Jenkins权限管控
需求: 不同的账号角色进入只能看到自己对应的项目,且只能拥有构建等基本权限. 如wechat用户进入系统只能看到以wechat开头的job(具体匹配什么名称的job,可以设置) 目录: 1.安装插件 ...
- 10-12Linux流编程的一些知识点
第五章 Linux 的流编程 Linux流操作基础 流和文件的关系:流相当于一个缓冲区,可以将文件描述符和流关联,获得相应的缓冲区,以此来提高系统对磁盘的存取速度. 流的结构和操作 ...
- TestNG参数化之@Parameters传参
通过TestNG实现参数话常用两种方式,一种是借助 @Parameters读取testng.xml中参数,一种是使用@DataProvider注解传参. 此次主要讲解XML传参,语法:在java类中定 ...
- Android - Telephony API 1.6
SignalStrength: 1. public int getGsmSignalStrength() : GSM Signal Strength, valid values are (0-31, ...
- OpenStack 业务链networking-sfc介绍 (2) - 底层原理
原文链接:https://blog.csdn.net/bc_vnetwork/article/details/65630475 1. SFC底层实现原理 port chain和ovs driver/ ...
- JAVA中Date类的使用
一. Date类 Date类对象的创建: 1.创建一个当前时间的Date对象 //创建一个代表系统当前日期的Date对象 Date d = new Date(); 2.创建一个我们指定的时间的Date ...
- clickonce联机模式
发布时选择该程序只能联机使用,这样本地就不会进行安装. 参考地址:https://blog.csdn.net/dqs78833488/article/details/52513948
- guzzle 简单使用记录
用 guzzle 发送一个包含指定请求头,请求体的 post 请求,并获取指定内容: <?php include_once "guzzle.phar"; use Guzzle ...