jma*_*rje 3 javascript recursion ecmascript-6
我正在编写函数来序列化和反序列化二叉树(只是将其转换为数组并返回到 BT),并且我很难在不使用全局变量来跟踪索引的情况下编写反序列化函数。
我的 Node 类如下所示:
class Node {
constructor(value) {
this.value = value
this.left = null
this.right = null
}
}
Run Code Online (Sandbox Code Playgroud)
我的序列化方法如下所示:
function serialize(node = this, list = []) {
if (!node) {
list.push('#')
return
}
list.push(node.value)
serialize(node.left, list)
serialize(node.right, list)
return list
}
Run Code Online (Sandbox Code Playgroud)
这是我的问题,在反序列化函数中,我必须为“索引”保留一个全局变量,有没有办法在不创建全局变量的情况下保留索引的全局值?
let index = 0
function deserialize(list) {
if (index === list.length || list[index] === '#') {
index++
return
}
const tree = new Node(list[index])
index++
tree.left = deserialize(list)
tree.right = deserialize(list)
return tree
}
Run Code Online (Sandbox Code Playgroud)
我最初是这样编写函数的:(但我不得不将索引变量重构为全局变量)
function deserialize(list, index = 0) {
if (index === list.length || list[index] === '#') {
index++
return
}
const tree = new Node(list[index])
index++
tree.left = deserialize(list, index)
tree.right = deserialize(list, index)
return tree
}
Run Code Online (Sandbox Code Playgroud)
这最终得到了一个对称树,因为 tree.left 和 tree.right 将始终采用相同的索引。
我只是好奇是否有一种简单的方法可以在不创建全局变量的情况下在纯递归函数(不使用递归子例程)中跟踪索引。
这样做的一般方法:
function wrapperFunction(args) {
var bookkeepingStuff = whatever;
function actualRecursiveFunction(args) {
// code
}
return actualRecursiveFunction(args);
}
Run Code Online (Sandbox Code Playgroud)
只需将真正的递归函数包装在另一个函数中。包装器的任何局部变量都将有效地类似于嵌套在内部的真实递归函数的全局变量。
| 归档时间: |
|
| 查看次数: |
1577 次 |
| 最近记录: |