我有一个递归函数,我正在尝试创建一个数组,这个数组对于递归中的for循环创建的每个“线程”都是不同的。
我有一个例子如下。在函数的初始传递中,变量ids
为undefined
。我将它设置为一个空数组,并将传递给该函数的id
推送到该数组。在示例中,这使ids
数组等于[2]
。
函数中的for循环以递归方式调用提供的函数id
大于0.在for循环的第一遍中,使用recursiveFunction
调用(2-1,[2])
;
此调用看到ids
不是undefined
,并将1
添加到构成数组[2,1]
的数组中。函数的第二次传递仅在调用recursiveFunction(1-1,[2,1])
时执行for循环。
我们现在进入函数的第3遍,它向数组追加零,因此数组现在为[2,1,0]。这结束了函数第一次运行中for循环的第一次运行。
我们现在回到函数原始调用中for循环的第二次运行。当我们离开它时,数组ids
是[2]
,但是,当我们记录它时,我们可以看到递归已经影响了数组的内容。这是有道理的,因为递归会影响数组,因为它被提升了。
我试图找到一种避免这种情况的方法,以便在递归完成时,第一次ids
数组为[2,1,0]
,第二次也为[2,1,0]
。目前,它是[2,1,0]
然后[2,1,0,1,0]
。
我正在尝试做什么?也许有一个我应该考虑的解决方法。这是代码。
outerFunction = function recursiveFunction (id,ids) {
if (typeof ids === 'undefined') {
ids = [];
}
ids.push(id);
for(var i=0;i<id;i++) {
recursiveFunction(id-1,ids);
}
if (id === 0) {
console.log('id is zero and ids is: ' + ids);
}
}
outerFunction(2);
答案 0 :(得分:2)
您需要在函数的每次调用中复制数组,否则所有参数都引用相同的数组(并修改它)。您可以使用Array slice
method。
function recursiveFunction (id,ids) {
if (typeof ids === 'undefined')
ids = [];
else
ids = ids.slice(); // copy
ids.push(id);
for (var i=0; i<id; i++)
recursiveFunction(id-1, ids);
if (id === 0)
console.log('id is zero and ids is: ' + ids);
}
现在,如果在数组中包含循环的i
,则会得到不同的输出。