我正在尝试在 javascript 中创建回溯算法(带有简单的前向检查)的实时演示。我已经以递归形式对算法进行了优化,但现在我一直在尝试使用 javascript 的setTimeout
or对其进行动画处理setInterval
,我假设这需要我将递归解决方案转换为迭代解决方案。这是函数(重写为更通用):
function solve(model) {
if (model.isSolved()) return true;
var chosen = chooseVariable(model); //could be random or least constrained
var domain = model.getDomain(chosen);
var i, assn;
for (i = 0; i < domain.length; i++) {
assn = domain[i];
model.set(chosen, assn);
if (solve(model)) return true;
else model.undo();
}
return false;
}
如您所见,我这样做是为了让模型可以撤消它自己的操作,而不是拥有一个单独的操作堆栈或在每个递归级别克隆模型。有没有办法将上面的函数转换为可以与setTimeout
or一起使用的函数setInterval
?我是否必须显着更改模型/添加另一个堆栈以跟踪所选变量/尝试的分配?我需要一个带有变异变量的闭包吗?我主要是在寻找伪代码来为我指明正确的方向。