1

今天我正在研究一种将刻度线放在标尺上的递归方法。作业说放置刻度线并打印它的高度和位置。假设 x & y 为 (0,0),宽度为 20,高度为 10,程序应显示类似

中间刻度线 - 位置 10,高度 10
位置 5,高度 5
位置 2.5,高度 2.5
位置 7.5,高度 2.5
位置 15.0,高度 5.0
位置 12.5,高度 2.5
位置 17.5,高度 2.5

请注意,允许的最小高度是 2.00,并且每个位置都是较大位置高度的一半。我尝试了很多东西,我有点想法,但没有奏效。我得到了从位置 10 到 7.5 的数字,但即使只是移动 x 坐标,右侧也是一团糟。这是我的代码,希望你能帮助我,谢谢。

*main method contains the input for user and the method calls.
        DrawRulerLeft(x,y,width,height);     //Method to draw left part of rule
        DrawRulerRight(x,y,width,height);   //Method to draw right part of rule

public static void DrawRulerLeft(double x, double y, double w, double h) {

  if (h > 2 ) {  //smallest height aloud
        w = w/2;  
        System.out.println("Tick position:+ w + " Tick height: " + h );
        DrawRulerLeft(x, y, w, h/2);
 } 
 }

//Recursive method to draw right of rule
 public static void DrawRulerRight(double x, double y, double w, double h) {

     if (h > 2 && w >= 0) {
        DrawRulerRight(x+w/2,y,w/2,h/2); 
        System.out.println("Tick position:" + x + " Tick height: " + h );
         }

    }
4

3 回答 3

2

基本上你只需要考虑到任何时候有一个标尺的划分,都有一个 + 和一个 - 排列。忽略标尺范式的左侧/右侧,因为每个分区只有左侧/右侧。

drawTicks(20, 20, 20);

public static void drawTicks(double h, double tick, double pos) {

    System.out.println("tick: " + tick + " pos: " + pos);

    if (tick / 2 >= 2) {

        if (tick != h) {
            drawTicks(h, tick / 2, pos + tick / 2);
        }

        drawTicks(h, tick / 2, pos - tick / 2);
    }

}

输出以下内容:

tick: 20.0 pos: 20.0
tick: 10.0 pos: 10.0
tick: 5.0 pos: 15.0
tick: 2.5 pos: 17.5
tick: 2.5 pos: 12.5
tick: 5.0 pos: 5.0
tick: 2.5 pos: 7.5
tick: 2.5 pos: 2.5
于 2013-10-22T04:02:29.893 回答
1

类似于两半的二进制遍历,请尝试以下方法:-

//Recursive method to draw 
private static void DrawRulerRecursive(double w, double h) {
  if (h > 2) {
    System.out.println("Tick position:" + w + " Tick height: " + h);
    DrawRuler(w+w/2,h/2);
    DrawRuler(w-w/2,h/2);
  }
}

public static void DrawRuler(int w, int h) {
   double mid = (0 + w)/2; // Range: (0:20), Mid: 10
   DrawRulerRecursive(mid, h);
}

这个问题类似于构建一个 BST,其中的高度tick在下降一个级别时减半。我的建议是深度优先中序遍历,但您也可以使用广度优先遍历。

于 2013-10-22T03:43:53.847 回答
1

height基本操作是在区间中间绘制一个高度刻度。现在xywidth没有定义,这是家庭作业,所以我将使用不同的符号。说给定的间隔是(a, b)

所以方法签名可以是void drawTick(double a, double b, double height).

该方法的第一行可以测试基本情况,这与高度至少为2有关。没有无限的递归调用,谢谢!

if(height < 2) return;

下一行可以“绘制”刻度线。

System.out.println("Tick position:"+ (a+b)/2 + " Tick height: " + height );

现在从这个设置中,您可能会弄清楚接下来需要做什么来绘制该高度一半的所有刻度。

于 2013-10-22T04:19:47.197 回答