Javascript 嵌套递归,查找所有可能的工件计数

Javascript 嵌套递归,查找所有可能的工件计数,javascript,recursion,permutation,Javascript,Recursion,Permutation,给出一个示例输入: [ {"id":1,"currentBlack":1,"currentWhite":0,"max":1}, {"id":2,"currentBlack":0,"currentWhite":1,"max":1}, ] 输出输入的所有可能状态,其中currentBlack和currentWhite的值可以在从初始值到最大值的范围内的任意位置 此示例的正确输出: [ [ {"id":1,"currentBlack":1,"currentWh

给出一个示例输入:

[
    {"id":1,"currentBlack":1,"currentWhite":0,"max":1},
    {"id":2,"currentBlack":0,"currentWhite":1,"max":1},
]
输出输入的所有可能状态,其中currentBlack和currentWhite的值可以在从初始值到最大值的范围内的任意位置

此示例的正确输出:

[
    [
        {"id":1,"currentBlack":1,"currentWhite":0,"max":1},
        {"id":2,"currentBlack":0,"currentWhite":1,"max":1},
    ],
    [
        {"id":1,"currentBlack":1,"currentWhite":1,"max":1},
        {"id":2,"currentBlack":0,"currentWhite":1,"max":1},
    ],
    [
        {"id":1,"currentBlack":1,"currentWhite":1,"max":1},
        {"id":2,"currentBlack":1,"currentWhite":1,"max":1},
    ],
    [
        {"id":1,"currentBlack":1,"currentWhite":0,"max":1},
        {"id":2,"currentBlack":1,"currentWhite":1,"max":1},
    ]
]
实际输入的最大值将介于1和8之间,并且输入数组中的对象将多得多。我的尝试如下(大量评论):


编辑:工作代码:

工件计数[n]始终引用一个对象。您应该重新创建
计件计数
,以便作为不同的对象保存到集合中。例如,您可以添加

pieceCounts = JSON.parse(JSON.stringify(pieceCounts)); // just clone 

递归调用
函数开始时。

分段计数[n]始终引用一个对象。您应该重新创建
计件计数
,以便作为不同的对象保存到集合中。例如,您可以添加

pieceCounts = JSON.parse(JSON.stringify(pieceCounts)); // just clone 

recursiveCalls
函数的开始处。

为了避免转换为JSON和JSON,我建议使用
对象。分配
与数组上的
映射
一起执行更深入的复制:

函数所有可能计数(计件计数){
var结果=[],
当前=深度检查(计件计数);
功能性深度检查(arr){
返回arr.map(row=>Object.assign({},row));
}
函数递归(深度){
//深度:指示将增加的值。每个“行”都有
//2项(黑色/白色),所以当深度均匀时,指黑色,当
//奇数到白色。除以2得到增量所在的“行”
//应该发生。
var idx=depth>>1,//除以2获得行索引
prop=深度%2?'currentWhite':'currentBlack',//奇数/偶数
行=计件计数[idx];
如果(!row){//位于数组末尾
//复制此变体并将其添加到结果中
结果:推送(深镜(当前));
return;//其他变体的回溯
}

对于(var value=row[prop];value为了避免转换为JSON并返回,我建议使用
Object.assign
在数组上结合
map
执行更深的复制:

函数所有可能计数(计件计数){
var结果=[],
当前=深度检查(计件计数);
功能性深度检查(arr){
返回arr.map(row=>Object.assign({},row));
}
函数递归(深度){
//深度:指示将增加的值。每个“行”都有
//2项(黑色/白色),所以当深度均匀时,指黑色,当
//奇数到白色。除以2得到增量所在的“行”
//应该发生。
var idx=depth>>1,//除以2获得行索引
prop=深度%2?'currentWhite':'currentBlack',//奇数/偶数
行=计件计数[idx];
如果(!row){//位于数组末尾
//复制此变体并将其添加到结果中
结果:推送(深镜(当前));
return;//其他变体的回溯
}

对于(var value=row[prop];值
pieceCounts[n]
始终引用一个对象。您应该重新创建
pieceCount
,以便将其作为不同的对象保存到集合中。例如,您可以添加
pieceCounts=JSON.parse(JSON.stringify(pieceCounts));//只需在
recursiveCalls
函数的开头克隆
。我认为这是指针问题,我不明白为什么要使用.slice()从未工作过,一秒钟前才发现这是因为尽管它在复制数组,但数组中对象的指针仍然是相同的。你应该把这作为一个答案,它是正确的,为什么不能将id:1、currentBlack:0、currentWhite:0的组合使用?因为初始输入设置了下限,这样你可以更容易地递归地遍历它,而不必在对象中有一个min:值。整个程序正在计算可以设置一个x,y尺寸的棋盘的合法方法的数量。这是拼图中的最后一块,它生成棋盘上的所有可能的组合。不必为零实际上,我的特定程序的最小限制是,董事会必须始终有一个黑人和一个白人国王才能合法。还有其他限制,但这一限制适用于此处
计件计数[n]
始终引用一个对象。您应该重新创建
pieceCount
以将其作为不同的对象保存到集合中。例如,您可以添加
pieceCounts=JSON.parse(JSON.stringify(pieceCounts));//只需在
recursiveCalls
函数的开头克隆
。我认为这是指针问题,我不明白为什么要使用.slice()从未工作过,一秒钟前才发现这是因为尽管它在复制数组,但数组中对象的指针仍然是相同的。你应该把这作为一个答案,它是正确的,为什么不能将id:1、currentBlack:0、currentWhite:0的组合使用?因为初始输入设置了下限,这样你可以更容易地递归地遍历它,而不必在对象中有一个min:值。整个程序正在计算可以设置一个x,y尺寸的棋盘的合法方法的数量。这是拼图中的最后一块,它生成棋盘上的所有可能的组合。不必为零我的特定程序的最低限制是,你必须始终有一个黑国王和一个白国王,董事会才合法。还有其他限制,但这一限制适用于此,与使用object.assign with map相比,转换为JSON和返回的效率有多高?谢谢!这真的很有帮助,下面的
pieceCounts = JSON.parse(JSON.stringify(pieceCounts)); // just clone