JavaScriptでチェーン操作を実現-18 Recursive Reverse


TL;DR
リンクを再帰的に反転させ、シリーズのディレクトリを前書きとディレクトリに合わせる.
需要
インプリメンテーション関数reverse()は、リンクを再帰的に反転させる.例は以下の通りです
var list = 2 -> 1 -> 3 -> 6 -> 5 -> null
reverse(list) === 5 -> 6 -> 3 -> 1 -> 2 -> null
法を解く
まず再帰の大体の解法を考えましょう.
function reverse(head) {
  const node = new Node(head.data)
  const rest = reverse(head.next)
  //   node    rest    ,    rest
}
面倒なところは最後になります.チェーンの最後にノードを入れるには、まずチェーン全体を巡回する必要があります.これは非常に効果がありません.私たちは前のkataのサイクルでどう解決しましたか?result変数を維持することは、反転チェーンテーブルを表し、その後、新しいノードをresultのヘッダに置くと同時に、新しいノードを新しいresultとして考えることである.
let result
for (let node = list; node; node = node.next) {
  result = new Node(node.data, result)
}
再帰的に同じ効果を達成するためにも、このような変数を維持しなければなりません.再帰のたびにこの変数を使用するためには、関数のパラメータとして伝えなければなりません.reverseの関数署名はこのようになります.
function reverse(head, acc) { ... }
ここでaccは反転チェーンです.整理したコードは以下の通りです.
function reverse(head, acc = null) {
  return head ? reverse(head.next, new Node(head.data, acc)) : acc
}
上のコードは同時に後戻りです.再帰関数において付加的なパラメータを開くのは一般的な方法であり,最終再帰的最適化の必要な手段でもある.
参考資料
Codewars Kata GitHubのコードはGitHubのテストを実現します.