void Form(int N, char pegA, char pegB, char pegC) {
if (N == 1)
cout<<"move top disk on peg "<<pegA<<" to peg"<<pegC<<endl;
else {
Form(N-1, pegA, pegC, pegB);
cout<<"move top disk on peg "<<pegA<<" to peg"<<pegC<<endl;
Form(N-1, pegB, pegA, pegC);
}
}
这是River of Hanoi Game的递归算法。这可以是深度优先搜索的一种形式吗?如果没有,那是什么?感谢
答案 0 :(得分:1)
这不是深度优先搜索,因为我们知道每次都要进行哪次移动,所以别无选择。你可以这样思考。没有比这更好的了。
看,在深度优先搜索的情况下,我们该怎么办?我们更深入,尝试找到正确的方法。但在这里,你能告诉我一个不必要的举动吗?没有。
所以这是一个简单的递归方法,我们解决较小的问题实例,然后构造 的解决方案>更大一个,简单地说,来自较小的结果。就是这样。
答案 1 :(得分:0)
这不是深度优先搜索。
这是递归树遍历 ...潜水?
算法中内置了移动的逻辑,它巧妙地使用递归来处理每个子塔的转换。这里没有搜索。
该算法以下列方式工作
这样做的方式是通过peg引用的巧妙(和混乱)操作。当它进行第二次递归调用时,它会重新映射哪些是源和目标挂钩。
需要注意的另一件事是:
此算法中没有持久状态。每个层唯一关心的状态是n
的状态,只有当它是1时才是。在函数输入时,当前层的状态(在启动挂钩上)和上面的所有层(也在启动挂钩上)是已知的,并且不需要当前任何磁盘的状态。
这就是为什么不需要实际移动;当状态已知时,关于状态变化的知识可以编码到算法中(并且通过传递给递归调用的挂钩的改变顺序)。没有必要根据当前状态做出决策,因此不需要实现状态。