【问题标题】:Erlang Code Snippet that shows off its benefits?展示其优点的 Erlang 代码片段?
【发布时间】:2011-11-30 08:12:25
【问题描述】:

我正在向一群对函数式语言几乎没有经验的 C/C++ 程序员做一个小型演示。演示文稿的一部分提到了 Erlang,我想给出一个具体的小代码示例。

StackOverflow 上有大量关于如何/在何处使用 Erlang 及其优势的信息。我看到的最常见的优点之一是它如何只用一点简洁的代码就可以做很多事情,尤其是与 C/C++ 相比。

我正在寻找一个很好的 Erlang 代码 sn-p,它可以简单地说明这些类型的好处。尤其是在 Erlang 中只需几行代码就可以轻松完成的事情,在 C/C++ 中会复杂得多。

有人有什么有趣的建议吗?

【问题讨论】:

  • 查看我关于毕达哥拉斯三元组的新答案

标签: erlang


【解决方案1】:

查看example 4 以获得 Erlang 位语法的一个很好的例子。我相信有很多 c/c++ 开发人员会欣赏语法的简洁性!

【讨论】:

  • 我喜欢这个,虽然它并没有真正展示 Erlang 的优势,而是展示了函数式编程的优势。
【解决方案2】:

我会用一个例子来说明并发是多么容易。

所以基本上写 map-reduce(但永远不要用这个词向 C 程序员描述它)。

您可以先显示一个播放Fizz Buzz 的程序,然后继续使其并发。应该很容易装下一块白板,或者两页 powerpoint。

【讨论】:

  • 对我来说很有趣的想法,巧合的是,Fizz Buzz 是该组的常用示例!
【解决方案3】:

一位同事建议以 Merge-Sort 为例:

http://rosettacode.org/wiki/Sorting_algorithms/Merge_sort#Erlang

mergeSort(L) when length(L) == 1 -> L;
mergeSort(L) when length(L) > 1 ->
    {L1, L2} = lists:split(length(L) div 2, L),
    lists:merge(mergeSort(L1), mergeSort(L2)).

多进程版本:

pMergeSort(L) when length(L) == 1 -> L;
pMergeSort(L) when length(L) > 1 ->
    {L1, L2} = lists:split(length(L) div 2, L),
    spawn(mergesort, pMergeSort2, [L1, self()]),
    spawn(mergesort, pMergeSort2, [L2, self()]),
    mergeResults([]).

pMergeSort2(L, Parent) when length(L) == 1 -> Parent ! L;
pMergeSort2(L, Parent) when length(L) > 1 ->
    {L1, L2} = lists:split(length(L) div 2, L),
    spawn(mergesort, pMergeSort2, [L1, self()]),
    spawn(mergesort, pMergeSort2, [L2, self()]),
    Parent ! mergeResults([]).

【讨论】:

    【解决方案4】:

    阶乘代码 sn-p 是我一直用来展示 erlang 程序有多短的最好的代码

    -模块(阶乘)。 -出口([计算/1])。 计算(0)-> 1; 计算(N)-> N * 计算(N -1)。

    就这么简单。这个简短的程序不仅说明了 Erlang 程序可以有多短,而且还说明了:<b>@987654321@</b>Function Clauses@987654322@

    我总是有相同的 C++ 版本,如下:

    #include #include 长阶乘(unsigned int a); 无效的主要(){ 无符号整数a; 长面; ...... ...... 返回阶乘(a); } 长阶乘(无符号整数 x){ 长 fac=1; if(x == 0) {返回 1;} 别的 { 而(x > 0){ fac *= x; x -= 1 ; } 返回 fac; } }

    嗯,这可能不是最短的 C++ 版本,但我知道你明白了。

    【讨论】:

    • 您可以在 C/C++ 中使用递归。 C/C++ 中的等效函数是:int factorial(int N) { if (N == 0) return 1; else return N * factorial(N-1); }
    • 完美!我的 C++ 是最糟糕的。谢谢@MustafaOzturk
    • 但是上面的 Erlang 阶乘代码不是最后一次调用可优化的。最后一次调用是乘以 N,它在第一次调用 calculate/1 完成之前等待任意数量的堆栈返回。需要计算/2 来迭代累加器以使 LCO 工作。
    • Pythagorean Triples查看我的新答案
    【解决方案5】:

    毕达哥拉斯三元组。得到所有低于 30 的数字组合,其中 3 个数字组成一个直角三角形,因为它是毕达哥拉斯的。

    [{X,Y,Z} || X <- lists:seq(1,30),
                Y <- lists:seq(1,30),
                Z <- lists:seq(1,30), ((X * X) + (Y * Y)) == (Z * Z)].
    

    尝试在 C/C++ 或 Java 中执行此操作,看看您是否会避免 for loop,如果不超过一个,取决于您的技能水平:)

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 2012-11-07
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多