iteration - 回溯范式 : is it possible to do it without recursion?

标签 iteration backtracking recursive-backtracking

<分区>

示例:用回溯法求解数独

如何在不使用递归的情况下回溯 - 使用循环?我只在您自己调用 backtrack() 时找到解决方案。

最佳答案

您可以使用堆栈模拟递归。

本质上,回溯在候选解决方案树中进行深度优先搜索。对于数独,这棵树在叶子处有完全填充的网格,在节点处有部分填充的网格。根是提供的网格。如果一个网格节点可以通过填充一个数字从它派生出来,那么它就是另一个网格节点的子节点。通过深度优先搜索和回溯之间的类比,您可以轻松地以递归方式或使用堆栈实现回溯。

堆栈可以(概念上)包含候选网格。首先,将提供的(和部分填充的)网格压入堆栈。然后在 while 循环内(检查堆栈是否为空),弹出顶部网格。检查网格是否完全填满。如果完全填满,则验证数独约束,如果满足则返回网格。如果网格未完全填充,则从中生成其他候选网格(可能没有),这些网格都被压入堆栈。这总结了转换的想法,但当然它并不是真正有效。

关于iteration - 回溯范式 : is it possible to do it without recursion?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21353664/

相关文章:

java - 做到这一点最有效的方法是什么?

c++ - 在 C++ 中使用回溯的背包解决方案

c - 不同环境下程序输出的差异

javascript - 更改 JavaScript 中 forEach 循环的每次迭代的颜色?

Javascript 对象 : iterating over properties

python - 如何优化代码以迭代 dict 并将值存储在列表中?

java - 为什么这个数组会被修改?

algorithm - 如何编写用于生成集合的所有子集的迭代算法?

java - 骑士之旅 - java 回溯,出界

c++ - 如何使用 void 类型处理递归回溯返回