2017-05-23 10 views
-1

以下は、不変変数の使用方法を示す例です。 (1)この方法はどのような機能を果たすか、(2)どの部分をアキュムレータと見なすか?彼のコメントに@jwvhで述べたようにScalaのアキュムレータ付きヘルパーメソッド

def fib(n: Int): Int = { 
    def fibIter(i: Int, a: Int, b: Int): Int = 
    if (i == n) a else fibIter(i+1, b, a+b) 
    fibIter(0, 0, 1) 
} 
+0

質問するには? – Stephen

+0

これは、フィボナッチシリーズを表現する何百もの方法の1つに過ぎません。 'a'と 'b'の両方を使用して、系列内の前の電流(または現在および次の)を計算/蓄積する。 'i'は要求されたレベル(' n'回帰)に達するのに必要な再帰を数えるカウンタです。 – jwvh

答えて

1

、これはFibonacci sequenceのn番目の項を計算するための機能です。

この特定の実装は、テール再帰的であり、内部関数fibIterを「アキュムレータ」として使用します。再帰関数のテール再帰的実装をコード化するために、所望の結果を蓄積する内部テール再帰関数を定義することは有用である。外部関数は、この内部関数をいくつかのデフォルトパラメータで呼び出すことになります。時には、この内側の関数は、「蓄積」と呼ばれているかなど、「行く」または「ループ」

ここ

だろう上記と同様のフィボナッチの私の好ましい実施...

def fibonacci(n: Int): Int = { 
    @annotation.tailrec 
    def iterate(i: Int, a: Int, b: Int): Int = 
    if (i == n) a else iterate(i+1, b, a+b) 
    iterate(0, 0, 1) 
} 

こと...ここでは、内部関数iterateを呼び出す方が好きです。これは、関数が何をしているのかをより正確に記述するためです(つまり、実際には何も蓄積していません)。

+0

ありがとうございました。私は今この機能から多くを学んだ。 – wayneeusa

+0

@davidpughありがとうございました。私は今この機能から多くを学んだ。 1)これはフィボナッチシーケンスです - リンクに感謝します。 2)fiblterはおそらくフィボナッチ反復子の略です。 3)nはあなたが望むシーケンスのメンバー数です。私はそこに行くためのカウンターです。 4)b/aトラックまたは戻り値を「累積」5)a + b/bはシーケンスの次の番号を累積します。それがフィボナッチであることを理解することが重要です。 6)内部関数は、アキュムレータ – wayneeusa

関連する問題