这个递归的河内塔算法是一种不知情的搜索吗?

时间:2017-06-22 13:42:39

标签: c++ algorithm search recursion depth-first-search

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的递归算法。这可以是深度优先搜索的一种形式吗?如果没有,那是什么?感谢

2 个答案:

答案 0 :(得分:1)

这不是深度优先搜索,因为我们知道每次都要进行哪次移动,所以别无选择。你可以这样思考。没有比这更好的了。

看,在深度优先搜索的情况下,我们该怎么办?我们更深入,尝试找到正确的方法。但在这里,你能告诉我一个不必要的举动吗?没有。

所以这是一个简单的递归方法,我们解决较小的问题实例,然后构造 的解决方案>更大一个,简单地说,来自较小的结果。就是这样。

答案 1 :(得分:0)

这不是深度优先搜索。

这是递归树遍历 ...潜水?

算法中内置了移动的逻辑,它巧妙地使用递归来处理每个子塔的转换。这里没有搜索。

该算法以下列方式工作

  • 递归结束:
    • 当剩余一个磁盘时,将其移至目标挂钩
    • 这是每个子塔移动的结束
  • 递归逻辑:
    • 将我们感兴趣的磁盘上方的所有磁盘移动到另一个挂钩
    • 输出我们感兴趣的磁盘的移动命令
    • 将之前移动的所有磁盘移动到我们刚移动的磁盘顶部。

这样做的方式是通过peg引用的巧妙(和混乱)操作。当它进行第二次递归调用时,它会重新映射哪些是源和目标挂钩。

需要注意的另一件事是:

此算法中没有持久状态。每个层唯一关心的状态是n的状态,只有当它是1时才是。在函数输入时,当前层的状态(在启动挂钩上)和上面的所有层(也在启动挂钩上)是已知的,并且不需要当前任何磁盘的状态。

这就是为什么不需要实际移动;当状态已知时,关于状态变化的知识可以编码到算法中(并且通过传递给递归调用的挂钩的改变顺序)。没有必要根据当前状态做出决策,因此不需要实现状态。