erlang不需要循环?

发布于 2021-11-17 09:35:18 字数 1607 浏览 11 评论 14

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(14

猫九 2021-11-18 04:10:20

呵呵。这么多人折腾erlang啊。不过我一直处于观望状态。这种工具方向性的决策,一做错了。我责任就大了。

反话 2021-11-18 04:10:20

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

清欢 2021-11-18 04:10:20

哦哦..受教受教..谢谢~~

永不分离 2021-11-18 04:10:12

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

多彩岁月 2021-11-18 04:10:11

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

后知后觉 2021-11-18 04:10:07

谢谢.怪不得java的递归怎么改都堆栈溢出

无人问我粥可暖 2021-11-18 04:10:03

scala的确可以..局限性指的是??例如?

情痴 2021-11-18 04:09:33

《Scala程序设计》8.9节有说明,主要是没办法实现更高级的尾递归,比如互相递归

把昨日还给我 2021-11-18 04:00:54

据我所知Java并没有支持尾递归,而Scala有支持,不过受限与JVM指令集,所以局限很大。

别再吹冷风 2021-11-18 04:00:47

见识了  还有尾递归

夜血缘 2021-11-18 03:41:03

请问java有尾递归的概念吗..

	public static BigDecimal f(BigDecimal x){
		return T.f(x, T.bd(1));
	}
	public static BigDecimal f(BigDecimal x, BigDecimal re){
		if (x.compareTo(T.bd(1)) == 0){
			return re;
		}else{
			return T.f(x.subtract(T.bd(1)), x.add(re));
		}
	}

算尾递归吗??一样会挂掉的?@
我土鳖 @
redraiment @红薯

断爱 2021-11-18 03:27:01

你没听说过“尾递归”?

拍不死你 2021-11-18 02:07:10

嗯..谢谢..的确..是我erl的方式不对...

蓝颜夕 2021-11-17 10:25:25

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文