以下は、不変変数の使用方法を示す例です。 (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)
}
以下は、不変変数の使用方法を示す例です。 (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)
}
、これは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
を呼び出す方が好きです。これは、関数が何をしているのかをより正確に記述するためです(つまり、実際には何も蓄積していません)。
質問するには? – Stephen
これは、フィボナッチシリーズを表現する何百もの方法の1つに過ぎません。 'a'と 'b'の両方を使用して、系列内の前の電流(または現在および次の)を計算/蓄積する。 'i'は要求されたレベル(' n'回帰)に達するのに必要な再帰を数えるカウンタです。 – jwvh