JavaScriptでチェーン操作を実現-18 Recursive Reverse
1262 ワード
TL;DR
リンクを再帰的に反転させ、シリーズのディレクトリを前書きとディレクトリに合わせる.
需要
インプリメンテーション関数
まず再帰の大体の解法を考えましょう.
参考資料
Codewars Kata GitHubのコードはGitHubのテストを実現します.
リンクを再帰的に反転させ、シリーズのディレクトリを前書きとディレクトリに合わせる.
需要
インプリメンテーション関数
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のテストを実現します.