【问题标题】:Executing following statements when base case met满足基本情况时执行以下语句
【发布时间】:2019-09-29 19:29:22
【问题描述】:

我正在使用 java 中的递归构建一个英文标尺。在使用drawRuler函数绘制刻度时,我遇到了一个问题,当值为0时,控件将如何执行以下语句。我的基本条件是: if(centalLength >= 1) 并且递归调用位于此控制语句中。在 drawInterval(centralLength - 1) 中面临问题。任何人都可以提供帮助,我想了解在满足基本案例后会做什么。

public static void drawRuler(int nInches, int majorLength) { 

        drawLine(majorLength, 0);      

        for(int j = 1; j <= nInches; j++) { 
            drawInterval(majorLength - 1);     
            drawLine(majorLength, j);      
        } 
    } 

    private static void drawInterval(int centralLength) { 

        if (centralLength >= 1) {           
            drawInterval(centralLength - 1);     
            drawLine(centralLength); 
            drawInterval(centralLength - 1); 
        }
    } 

    private static void drawLine(int tickLength, int tickLabel) { 

        for (int j = 0; j < tickLength; j++)
            System.out.print("-");

        if (tickLabel >= 0)
            System.out.print(" " + tickLabel);

        System.out.print("\n");

    }

    private static void drawLine(int tickLength) { 

     drawLine(tickLength, -1);

 }

代码没有错误。我想了解在满足基本条件后接下来的语句将如何执行。

【问题讨论】:

  • 当 centralLength 等于 0 时满足基本情况。任何满足基本情况的对 drawInterval 的递归调用,即使用参数 centralLength=0 调用将立即返回到调用方法。
  • drawInterval()方法中,当if(0 >= 1)条件为false时,drawLine(centralLength - 1)如何执行???
  • 它没有。如果您使用 centralLength=0 调用 drawLine,则递归调用停止并返回。使用 centralLength=1 调用 drawInterval 将调用 drawInterval(0),它立即返回,然后调用 drawLine(0),它打印出一些内容并返回,然后再次调用 drawInterval(0),它立即返回。
  • @Martin'sRun 你说的 drawInterval(0) 会立即返回,我的问题是当这个语句执行 drawInterval(centralLength - 1); ?如果你把 0 放进去,如果 (0 >= 1) 则 if 条件为假。

标签: java recursion data-structures


【解决方案1】:

当使用 0 调用 drawInterval(majorLength - 1)drawInterval(centralLength - 1); 时,将跳过绘制间隔调用,在 drawLine(majorLength, j) 处绘制线条 j &lt;= nInches 次。所以你的递归很糟糕 - 任何地方都不应该有循环,它本身就是循环。

例如drawRuler(1, 99) 将在 1 处绘制 99 条线。

以下是它将采取的步骤:

它在 0 处调用 draw line,然后初始化一个 for 循环。

for 循环的第一次迭代,majorLength - 1 为零,因此绘制间隔是无操作的。

然后用1和0调用draw line。

然后循环,majorLength - 1 还是0,所以draw interval no-ops,draw line用1和1调用。

然后它再次循环直到j = 99,每次调用draw line(1,j),这样就画了99条线。

您遇到的任何问题都与递归和循环的混合有关。你必须非常小心。

【讨论】:

  • drawInterval()方法中,当if(0 >= 1)条件为false时,drawLine(centralLength - 1)如何执行???
  • 不会,但是画尺的for循环中的画线调用会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
相关资源
最近更新 更多