当前位置: 首页 > 面试题库 >

河内递归塔Java

刘高峯
2023-03-14
问题内容

这是我使用递归解决河内塔的Java代码:

/**here is a stack of N disks on the first of three poles (call
them A, B and C) and your job is to move the disks from pole A to pole B without
ever putting a larger disk on top of a smaller disk.*/

public class Hanoi {

    public static void main(String[] args) {
        playHanoi (2,"A","B","C");
    }

    //move n disks from position "from" to "to" via "other"
    private static void playHanoi(int n, String from , String other, String to) {
        if (n == 0)
            return;
        if (n > 0)
        playHanoi(n-1, from, to, other);
        System.out.printf("Move one disk from pole %s to pole %s \n ", from, to);
        playHanoi(n-1, other, from, to);
    }

}

我放置打印方法的地方重要吗?另外,我可以这样做吗:

    playHanoi(n-1, from, to, other);
    playHanoi(n-1, other, from, to);
    System.out.printf("Move one disk from pole %s to pole %s \n ", from, to);

问题答案:

Tower of Hanoy以这种方式解决问题,无非是定义如何完成工作的策略。和你的代码:

    playHanoi(n-1, from, to, other);
    System.out.printf("Move one disk from pole %s to pole %s \n ", from, to);
    playHanoi(n-1, other, from, to);

基本上将您的策略​​定义为喜欢以下情况,

  1. 将 _ n-1个 磁盘从 _ “从” (源塔)移动到 _ “其他”_ (中间塔)。
  2. 然后将第 _ n 个磁盘从 _ “从” (源塔)移动到 _ “到”_ (目标塔)。
  3. 最后将 _ n-1个 磁盘从 _ “其他” (中间塔)移动到 _ “到”_ (目标塔)。

prinf基本上是使用 _ 2_ 档时。

现在,如果您编写这样的代码:

    playHanoi(n-1, from, to, other);
    playHanoi(n-1, other, from, to);
    System.out.printf("Move one disk from pole %s to pole %s \n ", from, to);

然后,您基本上在做:

  1. 将 _ n-1个 磁盘从 _ “从” (源塔)移动到 _ “其他”_ (中间塔)。

  2. 然后将 _ n-1个 磁盘从 _ “其他” (中间塔)移动到 _ “到”_ (目标塔)。

  3. 最后,将第 _ n 个磁盘从 _ “从” (源塔)移动到 _ “到”_ (目标塔)。

在这种策略中,在做后 _ 2 次步骤(移动所有 n-1个 从磁盘 _ “其他” ,以 _ “至” ), _3
第三步变为无效(移动 _ ñ 从第磁盘 _ “从” 到 _ “至”_ )!因为Tower of Hanoy您不能将较大的磁盘放在较小的磁盘上!

因此,选择第二种选择(策略)会导致您采用无效策略,这就是为什么您不能这样做!



 类似资料:
  • 本文向大家介绍河内塔问题,包括了河内塔问题的使用技巧和注意事项,需要的朋友参考一下 河内塔是一个难题的问题。我们有三个看台和n个光盘。最初,将光盘放置在第一支架中。我们必须将光盘放入第三个或目标支架,第二个或辅助支架可以用作帮助支架。 但是要遵循一些规则。  每个动作我们只能传送一张光盘。 只能从架子上取出最上面的光盘。 较大的光盘不会放在较小的光盘的顶部。 此问题可以通过递归轻松解决。首先,使用

  • 河内塔,是一个数学难题,由三个塔(钉)和多个环组成,如图所示 - 这些环具有不同的尺寸并以升序堆叠,即较小的环位于较大的环上。 这个拼图还有其他变化,其中磁盘数量增加,但塔数仍然相同。 规则 (Rules) 任务是将所有磁盘移动到另一个塔而不违反排列顺序。 河内塔要遵循的一些规则是 - 在任何给定时间,只能在塔之间移动一个磁盘。 只能删除“顶部”磁盘。 没有大磁盘可以放在小磁盘上。 以下是用三个磁

  • 我在维基百科上看到这个求解河内塔的递归算法。谁能给我解释一下我是怎么得到这个算法的递推方程的? null 将N-1个光盘从A移动到B,这将使光盘n单独位于peg A上 将磁盘n从A移动到C 将N-1个光盘从B移动到C,使它们位于光盘N上 上面是一个递归算法,为了执行步骤1和3,对n-1再次应用相同的算法。整个过程是一个有限的步骤,因为在某一点上,算法将需要n=1。这一步,将单个光盘从pega移动到

  • 我对函数式编程很陌生,尤其是下面使用的Scheme。我正在尝试使以下函数是递归的,尾递归的。基本上,该函数的作用是对两个字符串的对齐方式进行评分。当给定两个字符串作为输入时,它会比较每个“列”字符,并根据在称为 scorer 的函数中实现的评分方案(由下面的代码中的函数调用)来累积该对齐的分数。 我有一个想法,用一个帮助函数来累积分数,但我不太确定如何去做,因此我该如何让下面的函数尾递归呢?

  • 5.2. 递归 函数可以是递归的,这意味着函数可以直接或间接的调用自身。对许多问题而言,递归是一种强有力的技术,例如处理递归的数据结构。在4.4节,我们通过遍历二叉树来实现简单的插入排序,在本章节,我们再次使用它来处理HTML文件。 下文的示例代码使用了非标准包 golang.org/x/net/html ,解析HTML。golang.org/x/... 目录下存储了一些由Go团队设计、维护,对网

  • 递归允许函数调用自身。 固定的代码步骤一次又一次地执行新值。 我们还必须设置标准来决定递归调用何时结束。 在下面的例子中,我们看到了二进制搜索的递归方法。 我们采用排序列表并将其索引范围作为递归函数的输入。 使用递归进行二进制搜索 我们使用python实现二进制搜索算法,如下所示。 我们使用一个有序的项目列表,并设计一个递归函数,以带有开始和结束索引作为输入的列表。 然后二进制搜索函数调用自己直到