Java 河内塔-简单算法

Java 河内塔-简单算法,java,algorithm,recursion,towers-of-hanoi,Java,Algorithm,Recursion,Towers Of Hanoi,求解河内塔的简单递归代码: public static void hanoi(char A, char B, char C, int n) { if(n>0) { hanoi(A,C,B,n-1); System.ouit.println("moving from " + A + " to " + B); hanoi(C,B,A,n-1); } } 我和我的同学今天正在检查这段代码,虽然我们知道它是如何工作的,但我们无法理解算法,这意味着我们永远不会想到这样

求解河内塔的简单递归代码:

public static void hanoi(char A, char B, char C, int n) {
  if(n>0) {
    hanoi(A,C,B,n-1);
    System.ouit.println("moving from " + A + " to " + B);
    hanoi(C,B,A,n-1);
 }
}
我和我的同学今天正在检查这段代码,虽然我们知道它是如何工作的,但我们无法理解算法,这意味着我们永远不会想到这样的解决方案

我记得一位老师曾经说过,我们不在乎它是如何解决的,我们只是假设它是。他指的是函数调用自身的部分

我知道我们基本上是分两步解决河内塔问题。首先将所有环移动到C(这是老师的代码,在本例中,我们希望将所有环移动到B而不是C),然后将最大的环移动到B,然后将所有剩余环从C移动到B。我知道在第一次调用中,我们从a移动到C,第二次从C移动到B。 我在一篇论文上写了代码是如何执行并得到正确打印的,但我仍然不明白。我明白,但我不明白,如果你明白我的意思

ps:我查看了很多视频和链接,没有一个能给我任何有价值的答案,告诉我你会怎么突然想到这样的算法。这是不同的,例如fibonaccis序列,它是逻辑的。但是这个


编辑:我甚至很难解释我不懂的东西,我以前在编程方面从来没有遇到过问题。我知道这段代码是如何工作的,我可以把整个过程写在纸上。我知道如何解决河内塔。但如果你给我一个任务,写一个河内塔的算法,我永远不会想到这一点。我在看这段代码,我在说,这段代码到底是如何给出正确的打印输出的?我对这种信念的飞跃有一个问题,但不知何故,递归就是这样工作的。基本上,对于前两个环,我不难理解这个算法是有效的。但从那时起,移动戒指就不同了,因为你已经有两个戒指放在钉子上,你必须先移动它们,然后才能移动更多的戒指,然后再把那些旧戒指放回去。呃,我在编程方面从来没有遇到过问题,直到现在,这真的让我很困扰,因为这仅仅是一个开始,它应该是如此简单和合乎逻辑,以至于我们的老师甚至都没有解释它是如何工作的,他只是给了我们代码,然后继续

将调用
hanoi
函数想象为“使用心轴C作为备用,将整堆
n
磁盘从心轴A移动到心轴B”。如果您愿意假设它可以完成,那么将其概念化为函数调用。几分钟后,应该很清楚,这可以通过将桩移动到底部磁盘(具有
n-1
磁盘)上方来实现,从心轴a移动到备用心轴C,将底部磁盘移动到其目标心轴B,然后将备用磁盘上的堆栈从C移动到B。由于移动堆栈被认为是一个函数调用,因此在移动底部磁盘之前和之后,通过递归调用完成堆栈移动。剩下的唯一问题是认识到什么时候没有更多的事情要做。这由
n
计数器完成,它表示要移动的磁盘堆中的磁盘数。当它为零时,不需要采取任何行动


河内塔楼是“信念的递归飞跃”的一个很好的例子,在这个例子中,你假设通过函数调用可以解决问题,然后只将函数应用于一个或多个子问题+一个小问题。

看看看这是否有帮助:从47:15开始。这些课程不仅在历史上是惊人的。其中,河内塔。不要担心lisp中给出的类,它们的原理是一样的。

Hi,欢迎使用堆栈溢出。你能在你的帖子里添加一个具体的问题吗?请看,第三章,还有。@trashgood,非常感谢你的推荐。即使CLR也没有涵盖这一重要主题。顺便说一句,人们应该停止写咒语“如果你想学习递归,河内塔是一个经典问题”。虽然算法非常简单,但并不明显,也很难理解。