我无法理解的函数语法差异
Difference in syntax of a function that I cannot understand
我正在为广度优先搜索算法编写一个函数。我会想出以下代码
traverseBF() {
const results = []
const queue = [this.root]
while (queue.length) {
let node = queue.shift()
if (node.children) {
queue.push(...node.children)
}
results.push(node)
}
return results
}
但是,解决方案的写法有些不同
traverseBF(fn) {
const queue = [this.root]
while (queue.length) {
let node = queue.shift()
if (node.children) {
queue.push(...node.children)
}
fn(node)
}
}
我无法解释 fn(node)
目的是什么,也无法解释 returns 正确的结果。这是某种递归调用吗?这两种解决方案有何不同?
它们不像您那样返回结果,而是允许用户传入一个函数,该函数会在遍历每个节点时传递给它。
举个例子:
obj.traverseBF(node => console.log(node))
或者只是
obj.traverseBF(console.log)
应该也可以。 console.log
给每个节点以在找到时使用。
这可以说是更通用的目的。如果树很大,如果用户不需要同时需要所有结果,则将所有结果累积在一个列表中可能会浪费内存。
如果用户想要累积一个列表,他们可以传入一个附加到函数关闭的列表的函数:
nodes = [];
obj.traverseBF(node => nodes.push(node))
console.log(nodes)
我正在为广度优先搜索算法编写一个函数。我会想出以下代码
traverseBF() {
const results = []
const queue = [this.root]
while (queue.length) {
let node = queue.shift()
if (node.children) {
queue.push(...node.children)
}
results.push(node)
}
return results
}
但是,解决方案的写法有些不同
traverseBF(fn) {
const queue = [this.root]
while (queue.length) {
let node = queue.shift()
if (node.children) {
queue.push(...node.children)
}
fn(node)
}
}
我无法解释 fn(node)
目的是什么,也无法解释 returns 正确的结果。这是某种递归调用吗?这两种解决方案有何不同?
它们不像您那样返回结果,而是允许用户传入一个函数,该函数会在遍历每个节点时传递给它。
举个例子:
obj.traverseBF(node => console.log(node))
或者只是
obj.traverseBF(console.log)
应该也可以。 console.log
给每个节点以在找到时使用。
这可以说是更通用的目的。如果树很大,如果用户不需要同时需要所有结果,则将所有结果累积在一个列表中可能会浪费内存。
如果用户想要累积一个列表,他们可以传入一个附加到函数关闭的列表的函数:
nodes = [];
obj.traverseBF(node => nodes.push(node))
console.log(nodes)