`
nid007
  • 浏览: 45478 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

erlang入门系列(4) for循环,尾递归

阅读更多
因为Erlang里的变量只能一次赋值,所以并没有循环语句,只能用递归。所以所谓的Erlang for循环,也是用递归模拟的。看下面的求和代码:
for(Max, Max,Sum) ->
     Sum+Max;
for(First, Max,Sum) ->
     Sum2=Sum+First,
     for(First + 1, Max, Sum2). 


值得注意的是,如果循环次数过多,我们必须使用 尾递归。否则你的内存很快就会用光。尾递归我的理解是,调用了自身后,再没有别的代码要执行,概念上要说清楚还是比较 麻烦,各位意会吧。
下面是一个 非尾递归的示例:
loop() ->
	{From, {rectangle, Width, Ht}} ->
		From ! {self(), Width * Ht},
		loop(),
		someOtherFunc();
	{From, {circle, R}} ->
		From ! {self(), 3.14159 * R * R},
		 loop().


尽管尾递归不用消耗更的内存,然而它的效率仍然让我不敢恭维,我测试过1到100万的求和。用java的for循环实现,几乎是0秒就完成了,而用erlang的尾递归,却花了我33秒。下面是我的测试代码,如果你有更好的erlang实现,还请分享
main(_) ->
	Start = calendar:datetime_to_gregorian_seconds({date(), time()}),
	T=for(1,10000,0),
	End = calendar:datetime_to_gregorian_seconds({date(), time()}),
	io:format("~p ~p~n",[T,End-Start]).
	
for(Max, Max,Sum) ->
     Sum+Max;
for(First, Max,Sum) ->
     Sum2=Sum+First,
     for(First + 1, Max, Sum2). 




分享到:
评论
3 楼 腹黑君 2014-03-11  
Erlang不是分布式么。你试试分布式,开几条线程,那肯定很快。
2 楼 腹黑君 2014-03-11  
yanyu510 写道
可以参考以下代码

for(Max, Max) -> Max;
for(First, Max) -> First+for(First+1, Max).


这不好吧。。一直压栈,最后内存会崩掉的。
1 楼 yanyu510 2012-03-28  
可以参考以下代码

for(Max, Max) -> Max;
for(First, Max) -> First+for(First+1, Max).

相关推荐

    Erlang入门

    **Erlang入门** Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson在1986年开发,主要用于构建高度可靠和可扩展的分布式系统。这本书"Introducing Erlang"引领读者踏入这个独特的编程世界,...

    erlang开发入门教程

    erlang是爱立信开发的程序开发语言,融合了函数式编程与面向对象编程,并行处理内建与程序语言内部,特别适合创建并发行、容错性、分布性要求比较高的软实时系统,掌握它程序员必备的一种编程技能,与它相似的语言...

    Erlang入门:构建application练习5(监督树)

    在这个"Erlang入门:构建application练习5(监督树)"中,我们将探讨如何构建一个包含监督树的应用,这是Erlang OTP(开放电信平台)设计模式中的核心部分。 监督树是Erlang OTP设计原则的重要组成部分,它用于管理...

    erlang入门学习经典资料(很不错)

    ### Erlang 入门学习经典资料解析 #### Erlang 的神秘与起源 Erlang,作为一门相对小众但极具特色的编程语言,自问世以来便伴随着一种神秘的气息。这种神秘感不仅源于它独特的编程范式——函数式编程,还在于其...

    Erlang入门:构建application练习2

    4. **Supervisor**:在Erlang OTP(开放电信平台)中,Supervisors是行为模式之一,用于实现容错和重启策略。`bank1_sup`模块应包含一个`supervisor`行为的实现,负责启动和监控子进程。 5. **模块和功能**:在`src...

    erlang入门级练习:LeetCode OJ问题的部分erlang 源码

    我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...

    erlang 入门练习

    本文将通过"erlang 入门练习"的案例,探讨Erlang的基础知识和应用。 首先,让我们从`client.erl`这个文件名入手。在Erlang中,`.erl`文件是源代码文件,包含了Erlang的模块定义和函数实现。`client`可能表示一个...

    Erlang入门:构建application练习4(进程link的作用)

    在Erlang编程语言中,进程是其核心特性之一,它们是并发执行的实体,类似于其他语言中的线程。在Erlang中,进程间通信(IPC)是通过消息传递来实现的,而`link`机制是这个通信模型中非常重要的一部分。本教程将通过...

    Erlang入门ppt

    这份名为"Erlang入门ppt"的资料是英文版的,但提供了深入理解Erlang语言的基础。 在20世纪90年代初,软件项目成功率低、大型项目失败率高是一个普遍问题。研究指出,16%的软件项目成功,53%虽然运行但未达到预期,...

    Erlang初级入门(英文pdf)

    ### Erlang基础知识与特性 #### 一、Erlang简介 Erlang是一种专为处理大规模并发活动设计的编程语言,由瑞典电信设备制造商爱立信的计算机科学实验室(Computer Science Laboratory, CSLab)开发。该语言的目标是...

    erlang程序设计与入门

    **Erlang程序设计与入门** Erlang是一种并发、函数式编程语言,主要用于构建分布式、高可用性、容错性强的系统。它的设计灵感来源于电信行业的需求,由瑞典爱立信公司于1986年开发。Erlang以其独特的并发模型、轻量...

    ErLang 23.3.4 安装包,windosw版本64位安装包

    ErLang 23.3.4 安装包,windosw版本64位安装包

    erlang编程指南

    erlang编程语言圣经 erlang从业人员的必备书籍 erlang语言开发入门

    erlang入门手册

    Erlang入门手册深入浅出地介绍了Erlang语言的基本概念,包括顺序编程、并行编程、健壮性以及OTP设计原则。它为初学者提供了一个坚实的基础,帮助他们理解Erlang的核心特性,并开始构建并发和容错的应用程序。文档...

    erlang编程 Introducing Erlang

    "Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,旨在帮助初学者理解和掌握Erlang的核心概念和特性。 ### 1. 函数式编程基础 Erlang基于函数式编程范式,这意味着程序由纯函数构成,没有副作用。...

    erlang资源

    这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入理解和学习Erlang语言的关键资料。 《Erlang并发编程》这本书可能涵盖了以下知识点: 1. **并发模型**:Erlang的并发...

Global site tag (gtag.js) - Google Analytics