限制递归函数for循环内的变量范围
Limiting scope of variable within for loop on recursive function
我有一个递归函数,我正在尝试创建一个数组,该数组对于递归中的 for 循环创建的每个 "thread" 都是不同的。
我在下面有一个例子。在函数的初始传递中,变量 ids
是 undefined
。我将它设置为一个空数组,并将传递给函数的 id
推入该数组。在示例中,这使得 ids
数组等于 [2]
.
函数中的for循环递归调用函数,前提是id
大于0。在for循环的第一遍中,recursiveFunction
被(2-1,[2])
调用;
此调用发现 ids
不是 undefined
,并将 1
添加到数组,从而形成数组 [2,1]
。函数的第 2 遍仅在调用 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);
这是fiddle:http://jsfiddle.net/hzLm4rbq/
您需要在每次调用函数时复制数组,否则所有参数都引用同一个数组(并修改它)。您可以为此使用 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
合并到数组中,您将获得不同的输出。
我有一个递归函数,我正在尝试创建一个数组,该数组对于递归中的 for 循环创建的每个 "thread" 都是不同的。
我在下面有一个例子。在函数的初始传递中,变量 ids
是 undefined
。我将它设置为一个空数组,并将传递给函数的 id
推入该数组。在示例中,这使得 ids
数组等于 [2]
.
函数中的for循环递归调用函数,前提是id
大于0。在for循环的第一遍中,recursiveFunction
被(2-1,[2])
调用;
此调用发现 ids
不是 undefined
,并将 1
添加到数组,从而形成数组 [2,1]
。函数的第 2 遍仅在调用 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);
这是fiddle:http://jsfiddle.net/hzLm4rbq/
您需要在每次调用函数时复制数组,否则所有参数都引用同一个数组(并修改它)。您可以为此使用 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
合并到数组中,您将获得不同的输出。