erlang不需要循环?
erlang在介绍中表示, 它不需要for/while之类的语法..所有的循环都由递归来实现..
而且erlang的运算很牛X: 44444444444444444444444444444444*9999999999999999999999999999999999.
其它语言行吗??哗..的确牛...是的..的确他是办支了....
但....
f(n) = 1+2+3......+n这样的计算呢..
如果n过大.内存会不够用..
-module(total). -export([sum/1]). %% total.erl sum(0)-> 0; sum(NUM)-> NUM + sum(NUM-1).
total:sum(1000*1000*1000).
当然..其它语言.如java.scala..用递归写的程序也是一样的命运..甚至n在更小时就不行了..但一般情况下别"人"不会用递归吧..
//T.java import java.math.BigDecimal; public class T { public static void main(String[] args) { BigDecimal k = T.bd(1000); BigDecimal ten = T.bd(10); BigDecimal x = k.multiply(k).multiply(k); System.out.println(T.f(x));//递归 System.out.println(T.f2(x));//循环 } public static BigDecimal f2(BigDecimal x){ BigDecimal total = T.bd(0); while(x.compareTo(T.bd(0)) > 0){ total = total.add(x); x = x.subtract(T.bd(1)); } return total; } public static BigDecimal f(BigDecimal x){ if (x.compareTo(T.bd(0)) > 0){ return x.add(T.f(x.subtract(T.bd(1)))); }else{ return T.bd(0); } } public static BigDecimal bd(Double num){ return new BigDecimal(num); } public static BigDecimal bd(int num){ return new BigDecimal(num); } public static BigDecimal bd(String num){ return new BigDecimal(num); } }虽然代码多点.运行时间长点.但好歹java能跑出个结果来...erlang??这种情况下怎么办??不会告诉我.."加内存"吧??? 我不是erlang黑... 只是在想..这是erlang不流行的原因??还是我erl的方式不对..
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
呵呵。这么多人折腾erlang啊。不过我一直处于观望状态。这种工具方向性的决策,一做错了。我责任就大了。
一般来说循环可以写成尾递归,不需要保存调用栈,编译器优化过之后和C中的循环一样一样的。
哦哦..受教受教..谢谢~~
一般来说循环可以写成尾递归,不需要保存调用栈,编译器优化过之后和C中的循环一样一样的。
一般来说循环可以写成尾递归,不需要保存调用栈,编译器优化过之后和C中的循环一样一样的。
谢谢.怪不得java的递归怎么改都堆栈溢出
scala的确可以..局限性指的是??例如?
《Scala程序设计》8.9节有说明,主要是没办法实现更高级的尾递归,比如互相递归
据我所知Java并没有支持尾递归,而Scala有支持,不过受限与JVM指令集,所以局限很大。
见识了 还有尾递归
请问java有尾递归的概念吗..
算尾递归吗??一样会挂掉的?@
我土鳖 @
redraiment @红薯
你没听说过“尾递归”?
嗯..谢谢..的确..是我erl的方式不对...
一般来说循环可以写成尾递归,不需要保存调用栈,编译器优化过之后和C中的循环一样一样的。