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 ...
随机推荐
- 谈谈INotifyPropertyChanged和ICommand
WPF,Windows8和Windows Phone开发中的MVVM设计模式中很重要的两个接口是INotifyPropertyChanged和ICommand,深入理解这两个接口的原理,并掌握其正确的 ...
- solr特点三: boost(改变默认打分排序)
有时候默认的字段打分不能满足我们的需要,如我们想把关键词出现在标题中的优先显示. 测试于:Solr 4.5.1, Jdk 1.6.0_45, Tomcat 6.0.37 | CentOS 5.7 实现 ...
- 通过代码去执行testNG用例
背景 用testNG去编写的测试用例,通过@Test去执行用例,一般本地都是通过IDE去执行相应的方法,持续集成的话,都是通过maven来执行或指定testNG.xml执行,但是如果想通过接口/界面去 ...
- .NET Framework 历史版本(2017年)
.NET简介 这个平台相信我们都知道,不过随着技术发展,现在的.NET平台也今非昔比. .NET平台类似Java平台,是微软于2000年推出的Windows操作系统的应用软件开发框架,发展至今形成巨大 ...
- c语言第一次作业--顺序、分支结构
1.1思维导图 1.2.1本周学习体会以及代码量学习体会 1.2.2学习体会 因为在暑假时候没有对c语言进行学习,没太关注一些学习资料,一些教学视频也没看,感觉对c语言是陌生的,刚开课的时候自 ...
- 用TIdIPWatch获取本地IP
Indy的“indy misc”下有一个“TIdIPWatch”组件,可以正确获得本地IP,即使有多块网卡,也可以正确获得真正本地IP. 一,引入单元文件“IdIPWatch”. 二,实际代码: pr ...
- 【OCP-12c】2019年CUUG OCP 071考试题库(75题)
75.Which statements are correct regarding indexes? (Choose all that apply.) A. A non-deferrable PRIM ...
- “全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 转载文章 208 个最常见 Java 面试题全解析
最近正值春招,一直在给公司招聘 Java 程序员,我从 2015 年做 TeamLeader 开始就习惯性地收集平时遇到的 Java 技术问题或周围朋友见过的面试题,经过不断筛选,终于凝练成一套实用的 ...
- jmeter进行https协议的测试
一.HTTPS和HTTP的区别 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息.HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和 ...