javascript递归参数行为

javascript递归参数行为,javascript,recursion,Javascript,Recursion,我想列出所有可能的参数组合。我写了一个递归算法来解决这个问题。问题是我用作recurive参数的变量在递归调用之前没有保留它们的旧值 问题 假设我有两个参数,具有以下可能的值: P1 = A or B P2 = C or D or E 我想找到可能的组合: AC AD AE BC BD BE 递归“解决方案” 运行时问题 运行程序时,s变量会不断增长。前3次迭代给出: Before call A Before call A, E Before call A, E, G 在第一次调用ret

我想列出所有可能的参数组合。我写了一个递归算法来解决这个问题。问题是我用作recurive参数的变量在递归调用之前没有保留它们的旧值

问题

假设我有两个参数,具有以下可能的值:

P1 = A or B
P2 = C or D or E
我想找到可能的组合:

AC
AD
AE
BC
BD
BE
递归“解决方案”

运行时问题

运行程序时,s变量会不断增长。前3次迭代给出:

Before call A
Before call A, E
Before call A, E, G

在第一次调用return之后,我希望s变量包含AE,因为它是调用之前的值。

要修复算法,需要在从递归调用返回时从数组中弹出元素:

for (idx in p) {
    s.push(p[idx]);
    r(ps.slice(1), s);
    s.pop(); // remove the element once we are done with the recursion
}
但是请注意,
console.log
将显示对对象的引用,这意味着在控制台中,您将看到
s
为空,因为算法将很快完成,完成后
s
将因弹出而变为空。要强制
console.log
打印内容而不是引用,您可以使用
console.log(s.toString())

注意:你想要的是你的价值观。关于这一点,我有一个问题,这里有非常好的JavaScript答案:另请参见其他非懒惰JavaScript版本的开头句子中的链接。
for (idx in p) {
    s.push(p[idx]);
    r(ps.slice(1), s);
    s.pop(); // remove the element once we are done with the recursion
}
if (ps.length == 0) {
    console.log(s.toString());
    return;
}