2011-10-04 6 views
5

私は、機能的な言語の経験がほとんどないC/C++プログラマーのグループに小さなプレゼンテーションをしています。プレゼンテーションの一部でErlangが紹介されています。具体的な小さなコード例を挙げたいと思います。Erlangコードスニペットは、その利点を示していますか?

Erlangがどのように/どこで使用されているかについて、StackOverflowに関するすばらしい情報があります。私が見ている最も一般的な利点の1つは、C/C++と比較して、少し簡潔なコードで多くのことができる方法です。

私はErlangの優れたコードスニペットを探していますが、これは単にこれらのタイプのメリットを示しています。特にErlangで数行で簡単にやったことは、C/C++でもっと複雑になるでしょう。

誰か興味深い提案がありますか?

+0

ピタゴラスのトリプル –

答えて

4

Erlangのビット構文の優れた例については、example 4を参照してください。私は構文の簡潔さを理解するc/C++の開発者が数多くいると確信しています!

+0

私に私の新しい答えをチェックしてくださいこれはErlangの強みをFunctional Programmingの強みを実証しているように実感していませんが、このようなものです。 –

3

私は、並行性の実行がいかに簡単かを示す例を使用します。

基本的にmap-reduceを書いてください(Cプログラマに説明するためにその単語を使用することはありません)。

Fizz Buzzを再生するプログラムを表示してから、それを同時に実行することができます。ホワイトボード、またはパワーポイントの2ページに簡単に適合しなければならない。

+0

私にとって偶然の興味深いアイデアは、Fizz Buzzがこのグループでよく使用される例です! –

3

A同僚は、一例として、マージソートを使用して提案:

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([]). 
2

階乗のコードスニペットは、私が最良です常に短いエラングルプログラムの可能性を示すために使用されます

 
-module(factorial). 
-export([calculate/1]). 

calculate(0) -> 1; 
calculate(N) -> N * calculate(N -1). 

そのように簡単です。その短いプログラムは、Erlangプログラムの短期間の実例だけでなく、Pattern MatchingFunction ClausesLast Call Optimizationも示しています。

私はいつも同じのC++版を持っていた、下に:

 

#include<iostream.h> 
#include<conio.h> 

long factorial(unsigned int a); 

void main() { 
    unsigned int a; 
    long fac; 
    ..... 
    ..... 
    return factorial(a); 
} 

long factorial(unsigned int x) { 
     long fac=1; 
     if(x == 0) {return 1;} 
     else { 
       while(x > 0) { 
        fac *= x; 
        x -= 1 ; 
       } 
     return fac; } 
} 

まあ、これは最短C++バージョンではないかもしれないが、私はあなたのアイデアを得る知っています。

+1

C/C++で再帰を使用できます。 C/C++の同等の関数は次のようになります。 'int factorial(int N) { if(N == 0)は1を返します。 else N *階乗(N-1)を返します。 } ' –

+0

完璧!私のC++は最悪です。ありがとう@MustafaOzturk –

+1

しかし、上記のErlang階乗コードは最後の呼び出しを最適化できません。最後の呼び出しは、Nによる乗算であり、これは、/ 1を計算するための最初の呼び出しが完了する前に、任意のスタック戻り数で待機しています。 LCOが動作するためのアキュムレータを反復するには、calculate/2が必要です。 – zxq9

2

ピタゴリアントリプル。ピタゴラスによれば、3つの数字が直角の三角形を作る30以下の数字の組み合わせをすべて取得します。

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

あなたがfor loopない場合は、あなたのスキルレベルに応じて1つ以上のものを避けることができます場合はC/C++、またはJavaでと見ることをやってみ:)

関連する問題