es 6関数の最後の再帰用法の実例分析


この論文の実例は、es 6関数の最後の再帰的用法を述べている。皆さんに参考にしてあげます。具体的には以下の通りです。
関数が自身を呼び出して再帰と呼び、尾が自身を呼び出したら、それを再帰と呼びます。
再帰的にメモリが非常に消費されます。何千もの呼び出しフレームを同時に保存する必要があるので、スタックオーバーフローエラーが発生しやすいです。しかし、最終再帰的には、呼び出しフレームが一つしか存在しないため、「スタックオーバーフロー」エラーは永遠に発生しない。

function factorial(n) {
 if (n === 1) return 1
 return n * factorial(n - 1)
}

最後の再帰に変更した場合は、呼び出し記録だけを保持します。複雑度O(1)

function factorial(n, total = 1) {
if (n === 1) return total
return factorial(n - 1, n * total)
}

factorial(5)

非後戻りのFibonacci数列は以下の通り実現される。

function Fibonacci (n) {
 if ( n <= 1 ) {return 1};

 return Fibonacci(n - 1) + Fibonacci(n - 2);
}

Fibonacci(10) // 89
Fibonacci(100) //     
Fibonacci(500) //     

最後に再帰的に最適化したFibonacci数
列は次のように実装されます。

function Fibonacci2 (n , ac1 = 1 , ac2 = 1) {
 if( n <= 1 ) {return ac2};

 return Fibonacci2 (n - 1, ac2, ac1 + ac2);
}

Fibonacci2(100) // 573147844013817200000
Fibonacci2(1000) // 7.0330367711422765e+208
Fibonacci2(10000) // Infinity

再帰的な実装は、再帰関数を書き換える必要があり、最後のステップは自分自身だけで呼び出されるようにする。このようにする方法は、使用する内部変数をすべて関数のパラメータに書き換えることです。
関数式プログラミングには、複数パラメータの関数を単一パラメータに変換するという概念があります。ここでコリ化ができます。

function currying(fn, n) {
return function(m) {
return fn.call(this, m, n)
}
}

興味のある友達はオンラインHTML/CSS/JavaScriptコードを使ってツールを実行できます。http://tools.jb51.net/code/HtmlJsRun上記コードの運行効果をテストします。
もっと多くのJavaScriptに関する内容は当駅のテーマを調べられます。「JavaScript常用関数技術のまとめ」、「javascript対象向け入門教程」、「JavaScriptエラーとデバッグテクニックのまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」及び「JavaScript数学演算の使い方のまとめ
本論文で述べたように、JavaScriptプログラムの設計に役に立ちます。