我有一个递归函数,它返回树的叶节点(以嵌套对象的形式):
var retrieve = function (a)
{
if (typeof retrieve.names == 'undefined') //would be true for the 1st pass only
retrieve.names = []
if (a.left != null)
retrieve (a.left)
if (a.right != null)
retrieve (a.right)
if (a.left == null && a.right == null)
retrieve.names.push(a)
return retrieve.names
}
这个函数的问题是,它对单个对象(树)完全正常,但是当在参数中传递另一个对象时,它只是将叶节点附加到已经从前一个树获得的叶节点。 / p>
例如,
// gets the leaf nodes of obj1 tree
obj1_leaves = retrieve(obj1)
// instead of only getting leaf nodes of obj2, it appends them to leaf nodes of obj1
obj2_leaves = retrieve(obj2)
现在原因是typeof retrieve.names == 'undefined'
仅适用于第一次。每当再次调用此函数时,names
函数的成员retrieve
(也可以被视为对象)已经设置/初始化。
是否有办法在给定函数调用的递归函数内设置变量(或对象的成员),然后再次取消设置/设置另一个函数调用。
答案 0 :(得分:5)
您可以使用内部功能:
function retrieve(a) {
var names = [];
function _retrieve(a) {
if (a.left != null)
_retrieve (a.left)
if (a.right != null)
_retrieve (a.right)
if (a.left == null && a.right == null)
names.push(a)
}
_retrieve(a);
return names;
}
外部函数将空数组初始化为局部变量。内部函数与原始函数基本上完成相同的工作,但它引用了本地数组。
每次调用retrieve()
时,都会创建一个新的本地数组并用于遍历树。
答案 1 :(得分:3)
另一种方法(对于@Pointy给出的方法,我不打算重复)是使用可选参数。它仅在“first”,最外部调用上填充默认值,然后传递给每个递归调用。
function retrieve(a, names) {
if (!names) names = [];
if (a.left != null)
retrieve(a.left, names);
if (a.right != null)
retrieve(a.right, names);
if (a.left == null && a.right == null)
names.push(a);
return names;
}