河内塔显示输出。如何显示第一个递归调用的1个选项卡,第二个递归调用的2个选项卡等?

时间:2010-11-22 16:07:59

标签: java data-structures recursion towers-of-hanoi

我的任务是添加一堆打印语句来显示河内之塔的完整输出,以查看并了解它在幕后的作用,而不仅仅是给你最后的结果

class TowersApp {
    static int nDisks = 3;
    public static void main(String[] args) {


        doTowers(nDisks, 'A', 'B', 'C');
    }

    public static void doTowers(int topN, char from, char inter, char to) {
        int i = 0;

        if(topN==1) {
            System.out.println("Enter (" + topN + " disk): " + "s=" + from + ", i=" + inter + ", d=" + to);
            System.out.println("Base case: move disk " + topN + " from " + from + " to "+ to);
            System.out.println("Return (" + topN + " disk)"); }
        else {
            System.out.println("Enter (" + topN + " disks): " + "s=" + from + ", i=" + inter + ", d=" + to);
            doTowers(topN-1, from, to, inter);
            System.out.println("Move bottom disk " + topN +
                    " from " + from + " to "+ to);
            doTowers(topN-1, inter, from, to);
            System.out.println("Return (" + topN + " disks)");

        }
    }
}

这是我的输出。我唯一缺少的是缩进。我需要为第一级递归提供1个选项卡,为第二级递归提供2个选项卡等等......这就是我的意思:

当前输出:

Enter (3 disks): s=A, i=B, d=C
Enter (2 disks): s=A, i=C, d=B
Enter (1 disk): s=A, i=B, d=C
Base case: move disk 1 from A to C
Return (1 disk)
Move bottom disk 2 from A to B
Enter (1 disk): s=C, i=A, d=B
Base case: move disk 1 from C to B
Return (1 disk)
Return (2 disks)
Move bottom disk 3 from A to C
Enter (2 disks): s=B, i=A, d=C
Enter (1 disk): s=B, i=C, d=A
Base case: move disk 1 from B to A
Return (1 disk)
Move bottom disk 2 from B to C
Enter (1 disk): s=A, i=B, d=C
Base case: move disk 1 from A to C
Return (1 disk)
Return (2 disks)
Return (3 disks)

期望的输出:

Enter (3 disks): s=A, i=B, d=C
    Enter (2 disks): s=A, i=C, d=B
        Enter (1 disk): s=A, i=B, d=C
            Base case: move disk 1 from A to C
        Return (1 disk)
    Move bottom disk 2 from A to B
Enter (1 disk): s=C, i=A, d=B
...................................

我是否需要某种计数器来“计算”我进入该功能的次数?但那么,递归后甚至可能吗?也许我正在分析什么时候有一个更简单的解决方案来解决这个问题?

4 个答案:

答案 0 :(得分:2)

一种简单的方法是向doTowers添加一个名为indent的String参数,该参数将被添加到所有输出之前。来自main的调用将传递一个空字符串,doTowers中的每个调用都会向该参数添加空格或制表符(即doTowers(indent+" ",...))。您已将每个System.out.println(...)更改为System.out.println(indent+...)

答案 1 :(得分:2)

最简单但尽管可能不优雅的方法是将递归深度作为函数的一个整数参数传递,并将其递增到每个新的深度级别:

public static void doTowers(int topN, char from, char inter, char to, int depth)

....

doTowers(..., depth + 1)
doTowers(..., depth + 1)

从主要功能的深度0开始。然后,只为每\t打印depth

答案 2 :(得分:1)

当然,一个柜台很好地解决了这个问题。你如何在递归中得到它?简单,将其作为参数传递!

答案 3 :(得分:1)

为什么不传入一个随每次递归调用而递增的附加参数?

public static void doTowers(int topN, char from, char inter, char to, int depth)

以及稍后

doTowers(topN-1, from, to, inter, depth+1);

深度将显示要使用的标签数量。第一次通话将是0深度。