浏览 2478 次
锁定老帖子 主题:尾递归与ERLANG编译器
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-14
最后修改:2009-08-14
loop() -> .... loop(), someFun(); 书中讲从编译器的角度推断,loop()完了后,还要把someFun()的地址压栈,然后跳到loop的开头.可问题是:如果是一个死循环,方法没有返回,someFun()也不会做什么,每次执行完loop()的时候又会把someFun()压到控制栈,结果就是系统消耗掉所有空间挂掉.... 本人拙见: 不能像类似像JAVA的编辑器一样,定义一个变量而不使用的话,会有提示:变量未使用。 在Erlang的编译器进行语法解析的时候,如果发现是尾递归,且尾递归后有内容,一概就不处理了,并进行提示。至少在编译阶段就可以减少问题的发生。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-14
后面有东西就不是尾递归,没东西才是尾递归.你说编译器怎么知道你想写尾递归,最后写成递归了,还要自作聪明的把后面的省略了?
|
|
返回顶楼 | |
发表时间:2009-08-14
haskell编译器就可以把很多看起来不是尾递归的递归优化为尾递归,我记得有篇论文说明的……
|
|
返回顶楼 | |
发表时间:2009-08-15
dogstar 写道 后面有东西就不是尾递归,没东西才是尾递归.你说编译器怎么知道你想写尾递归,最后写成递归了,还要自作聪明的把后面的省略了?
我做了一个小例子, loop() -> ..... loop(), someFun(); 我设定的是5秒钟receive超时一次,的确,每次执行的时候,erlang是把somfun()的地址压一次栈,当我超时10次后手动结束程序,SHELL中还是显示出来了10次someFun()的输出信息。 2楼说“后面有东西就不是尾递归,没东西才是尾递归"我在书中没有看到这个定义,不知道是不是官方英文版这么说的。如果这种写法不是尾递归,一般在什么场景使用? 为什么JOE大伯又说这是一段错误的代码?我觉得本身就是写法错误,导致了该是尾递归但又不是尾递归的产生,而编译器又没有判断才产生了歧义。 |
|
返回顶楼 | |
发表时间:2009-08-15
Magicloud 写道 haskell编译器就可以把很多看起来不是尾递归的递归优化为尾递归,我记得有篇论文说明的……
从原理上说,任何东西都可以转为尾递归。 |
|
返回顶楼 | |