erlang 编程指南 第三章-顺序编程 课后练习
1. sum(3) => 6; sum(1,3) => 6; sum(6,6) => 6;
sum(N) when is_integer(N) -> sum_acc(N,0);
sum(_) -> {error, {bad_argument}}. sum_acc(0, Sum) -> Sum;
sum_acc(N, Sum) -> sum_acc(N-1, Sum + N). sum(N, M) when is_integer(N), is_integer(M), M >= N -> sum_acc3(N, M, 0);
sum(_, _) -> {error, {bad_argument}}. sum_acc3(N, N, Sum) -> Sum + N;
sum_acc3(N, M, Sum) -> sum_acc3(N, M-1, Sum+M).
2. creat(3) => [1,2,3];
creat(N) when N > 0 -> creat_acc(N, []);
creat(_) -> {error, {bad_argument}}. creat_acc(0, List) -> List;
creat_acc(N, List) -> creat_acc(N-1, [N | List]).
3. 打印 1~N 的整数
print(N) when is_integer(N), N > 0 -> print_acc(N,0);
print(_) -> {error, {bad_argument}}. print_acc(0,List) -> io:format("Numer:~p~n", [List]);
print_acc(N,List) -> print_acc(N-1,[N|List]).
3-5 列表操作
filter(List, N) when is_list(List) -> filter_acc(List, N, []);
filter(_, N) -> {error, {bad_argument}}. filter_acc([], N, List) -> onelist(List);
filter_acc([H|T], N, List) when H =< N -> filter_acc(T, N, [onelist(List)|H]);
filter_acc([H|T], N, List) when H > N -> filter_acc(T, N, List). onelist([]) -> [];
onelist([H|T]) when is_list(H) -> H ++ onelist(T);
onelist([H|T]) when not is_list(H) -> onelist(H) ++ onelist(T);
onelist(H) -> [H].
erlang 中的 ++ 是很耗性能的,这在erlang 编程指南中有明确指出, 而且onlist 对于头部是复杂列表(非结构良好列表)时什么报错比如
[[[[[[[]|1]|2]|3]|5]|6]|7] ++ [8] 就会报错,++ 号两边列表结构不对等, 下面优化下。
filter(List, N) when is_list(List) -> filter_acc(List, N, []);
filter(_, N) -> {error, {bad_argument}}. filter_acc([], N, List) -> io:format("List : ~p | ~p~n", [List, concat(List)]), concat(List);
filter_acc([H|T], N, List) when H =< N -> filter_acc(T, N, [List|H]);
filter_acc([H|T], N, List) when H > N -> filter_acc(T, N, List). concat([H|[]]) -> [H];
concat([[]|T]) -> [T];
concat([H|T]) -> lists:concat([concat_cc(H) , concat_cc(T)]).
concat_cc(N) when is_list(N) -> concat(N);
concat_cc(N) -> [N].
erlang 编程指南 第三章-顺序编程 课后练习的更多相关文章
- [书籍翻译] 《JavaScript并发编程》第三章 使用Promises实现同步
本文是我翻译<JavaScript Concurrency>书籍的第三章 使用Promises实现同步,该书主要以Promises.Generator.Web workers等技术来讲解J ...
- Objective-C 基础教程第三章,面向对象编程基础知
目录 Objective-C 基础教程第三章,面向对象编程基础知 0x00 前言 0x01 间接(indirection) 0x02 面向对象编程中使用间接 面向过程编程 面向对象编程 0x03 OC ...
- PADSPCB权威指南-第三章 预处理(部分)(原创)
PADSPCB权威指南-第三章(部分)豆丁地址:http://www.docin.com/p-707132066.html
- Knockout应用开发指南 第三章:绑定语法(3)
原文:Knockout应用开发指南 第三章:绑定语法(3) 12 value 绑定 目的 value绑定是关联DOM元素的值到view model的属性上.主要是用在表单控件<input&g ...
- Knockout应用开发指南 第三章:绑定语法(2)
原文:Knockout应用开发指南 第三章:绑定语法(2) 7 click 绑定 目的 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用 ...
- Knockout应用开发指南 第三章:绑定语法(1)
原文:Knockout应用开发指南 第三章:绑定语法(1) 第三章所有代码都需要启用KO的ko.applyBindings(viewModel);功能,才能使代码生效,为了节约篇幅,所有例子均省略了此 ...
- VSTO开发指南(VB2013版) 第三章 Excel编程
通过前两章的内容,有了一定的基础,但进入第三章,实例的步骤非常多,并且随着VS版本的升级,部分功能菜单界面发生了很大变化,所以,第三章的案例我将逐步编写! 实例3.1的目标就是给Excel写一个加载宏 ...
- 安卓权威编程指南 - 第五章学习笔记(两个Activity)
学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 ...
- Spring 学习指南 第三章 bean的配置 (未完结)
第三章 bean 的配置 在本章中,我们将介绍以下内容: bean 定义的继承: 如何解决 bean 类的构造函数的参数: 如何配置原始类型 (如 int .float 等) .集合类型(如 ja ...
随机推荐
- grep -P的一个小问题
用grep时,发现一个怪异的问题. 背景:grep -E表示用扩展的正则表达式.grep -P 表示用perl正则表达式,区别:http://www.cnblogs.com/wangkangluo1/ ...
- android 处理图片之--bitmap处理
-2.从资源中获得bitmap Resources res=getResources(); Bitmap bmp=BitmapFactory.decodeResource(res, R.drawabl ...
- Lua 第一个应用程序 Hello World
lua 开发环境的搭建 现已windows系统为例,演示一下lua环境的搭建. Lua_v5.1.4 下载地址 http://code.google.com/p/luaforwindows/ 点击&q ...
- 分布式数据库中间件–(3) Cobar对简单select命令的处理过程
友情提示:非原文链接可能会影响您的阅读体验,欢迎查看原文.(http://blog.geekcome.com) 原文地址:http://blog.geekcome.com/archives/284 在 ...
- Winform-CheckBox、ChecklistBox控件遍历代码
CheckBox,是各种开发语言环境和网页中常用的控件.下面,本文给大家讲解的是C#Winform版的CheckBox.控件遍历.全选.反选实例代码.①直接引用如果窗体form中存在CheckBox控 ...
- solr使用方法 完全匹配
最近一直被solr的搜索困扰,搜索汉字时不能搜索出自己想要的内容,经过研究和查询发现,问题出在没有完全匹配上,主要还是对solr使用不太熟练. 解决方法:以前UserRealname:某某家长,这样搜 ...
- 关于IB_DESIGNABLE / IBInspectable的那些事
前言 IB_DESIGNABLE / IBInspectable 这两个关键字是在WWDC 2014年”What’s New in Interface Builder”这个Session里面,用Swi ...
- 【iOS程序启动与运转】- RunLoop个人小结
学习iOS开发一般都是从UI开始的,从只知道从IB拖控件,到知道怎么在方法里写代码,然后会显示什么样的视图,产生什么样的事件,等等.其实程序从启动开始,一直都是按照苹果封装好的代码运行着,暴露的一些属 ...
- [转]Form中控制Tab画布不同标签间切换的方法
转自:http://yedward.net/?id=68 Form中一般常用的画布类型包括content.stacked.tab这三种,其实content类型的画布是每一个form都必须有的,而且只能 ...
- VBA控件ListBox的BoundColumn和TextColumn用法,Value和Text的用法
在使用Excel编写VBA程序时,用到ListBox,然后研究了下它的所有属性.其实这个控件功能很不好用,太老了,最重要的是还不支持鼠标滚轮,很不好操作,但是考虑到兼容性,还是使用它. 其实读取.写入 ...