注册

erlang不需要循环?

erlang在介绍中表示, 它不需要for/while之类的语法..所有的循环都由递归来实现..
而且erlang的运算很牛X: 44444444444444444444444444444444*9999999999999999999999999999999999.

其它语言行吗??哗..的确牛...是的..的确他是办支了....

但....

f(n) = 1+2+3......+n这样的计算呢..

如果n过大.内存会不够用..
-module(total).
-export().

%% 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 cl** T {
public static void main(String[] args) {
BigDecimal k = T.bd(1000);
BigDecimal ten = T.bd(10);
BigDecimal x = k.multiply(k).multiply(k);
**.out.println(T.f(x));//递归
**.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的方式不对..











已邀请:
一般来说循环可以写成尾递归,不需要保存调用栈,编译器优化过之后和C中的循环一样一样的。

要回复问题请先登录注册