2017-10-22 11 views
3
fun({0, M}) -> {M+1, M-2}; 
fun({N, M}) -> 
{A, B} = fun({N-1, M+1}), 
      {B, A+1}. 

ので、私はAとBは次のようになり、次の再帰呼び出しが可能だろうか何のちょっとわからないです。それはこのerlang関数で再帰呼び出しはどのように機能しますか?

f(2,2) -> {A,B} = fun({1,3}), {B,A+1} 
f(1,3) -> {A,B} = fun({0,4}), {B,A+1} 
f(0,4) -> {5,2} 

が、ここでAとBが行くん、彼らはそれぞれの再帰呼び出しに変更するんだろう2,2

を言わせて?

+0

各呼び出しは、新しいコンテキストではないのかorelseはレムトライを受信許可すればandalsoバンドがBNOT BOR BSL BSR BXOR場合、キャッチのcondのdivエンドの楽しみを開始 - :ここにthe list of reserved wordsです例外は意図的に外部状態を閉じるときです。いくつかの再帰的イディオムのより一般的な説明に少しバックアップすることを考えてください:[リストの説明:foldl関数](https://stackoverflow.com/questions/26854586/explanation-of-listsfold-function/26855055#26855055) – zxq9

答えて

2

あなたはちょうど戻ってする必要があります。

funはアーランのキーワードであるとf(N,M)f({N,M})と同じではないことに注意)

f({1, 3}) -> {A, B} = {5, 2}, {B, A+1} -> {2, 6} 
f({2, 2}) -> {A, B} = {2, 6}, {B, A+1} -> {6, 3} 

、彼らはそれぞれに変更できますかあなたが見ることができるように再帰呼び出し

はい、。その後、我々は0ある基本ケースを、ヒットした場合

、我々は:「ここで私の変数がある」の非常に基本的な説明として

3

、この例のモジュールでカウントダウン機能を考えますやめる。関数overallの戻り値は、の原子です(これはio:format/2への正常呼び出しの戻り値です)。入力は、その後、我々は意味二句、上一致0よりも大きい場合

は、我々は、この特定の反復ための唯一の入力引数N割り当てます。次に行うことは、私たちの出力呼び出しです。次に、の値にNextを割り当てます。次に、入力引数として現在の呼び出しの本体にあるNextの値を使用して、同じ関数を再度呼び出します(ループを実行します)。

次の繰り返しこれは新しい実行コンテキストであるため、すべての変数は完全に新しいものです。古いNNextは存在しなくなりました。実際には、Erlangが "tail call optimization"を使用してconstant spaceの再帰的テールコールを維持するため、他のほとんどの言語が明示的にforまたはwhileまたはdo whileまたは[insert form]を実行するのと同じ方法でスタックにイベントが存在しません。

Alexyが指摘しているように、トークンについては注意してください。fun - これは正式な関数名ではなくErlangのキーワードです。 anonymous functionlambdaとも呼ばれます)の名前ではありません。つまり、ラベルを指定しない限り、すべての無名関数の名前はただfunです。

funは、関数を呼び出す代わりに(値自体として使用する)ラベルを使用して関数を参照するために使用されるキーワードでもあります。たとえば、countdown(10)は、上記の関数を引数10で呼び出します。 を参照すると、関数はfun countdown/1として関数自体を値として返します。つまり、モジュールの先頭にある関数のエクスポート宣言が、-module([countdown/1])と書かれているのは、この関数の明示的な名前であるからです。この考えてみましょう:私は件名によながら

1> c(example). 
{ok,example} 
2> example:countdown(2). 
Counting down in: 2 
Counting down in: 1 
Blastoff! 
ok 
3> Countdown = fun example:countdown/1. 
#Fun<example.countdown.1> 
4> Countdown(2). 
Counting down in: 2 
Counting down in: 1 
Blastoff! 
ok 

を...

Erlangのは(実際には、非常に少ないシンタックス)ほとんどの言語に比べて非常にいくつかのキーワードがあります。後

とするとき、XOR

関連する問題