Java 递归方法.标尺刻度线

Java 递归方法.标尺刻度线,java,methods,recursion,Java,Methods,Recursion,今天我正在研究一种递归方法,在尺子上画记号。作业要求放置记号并打印其高度和位置。假设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坐标。

今天我正在研究一种递归方法,在尺子上画记号。作业要求放置记号并打印其高度和位置。假设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 );
         }

    }

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

//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,其中
滴答声
的高度在下降一层时减半。我的建议是深度优先顺序遍历,但也可以使用广度优先遍历。

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

//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,其中
滴答声
的高度在下降一层时减半。我的建议是深度优先顺序遍历,但也可以使用广度优先遍历。

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

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

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

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

<>基本操作是在间隔中间绘制高度>代码>高度>代码>。现在没有定义
x
y
width
,这是家庭作业,所以我将使用不同的表示法。假设给定的间隔是
(a,b)

因此,方法签名可以是
void drawTick(双a、双b、双高度)

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

if(height < 2) return;

现在,从这个设置中,你可以找出需要做什么来画出所有高度的一半。

< P>基本操作是在间隔的中间画一个高度的标号“代码>高度< /代码>。现在没有定义
x
y
width
,这是家庭作业,所以我将使用不同的表示法。假设给定的间隔是
(a,b)

因此,方法签名可以是
void drawTick(双a、双b、双高度)

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

if(height < 2) return;

现在,通过这个设置,您可以了解接下来需要做什么来绘制该高度一半的所有刻度。

我没有测试您的代码,但知道您需要从两个方法中调用这两个方法。换句话说,
drawRulerLeft(…)
将需要调用
drawRulerLeft(…)
drawRulerRight(…)
,对于
drawRulerRight(…)
也是如此。还要注意的是,方法名称应该以小写字母开头,代码格式很重要,不应该被认为是理所当然的(正如您所做的那样)。使用左右方法的原因尚不清楚。为什么一个递归函数不能同时处理这两个子函数-problems@clwhisk:很好。@clwhisk是的,我确实想过只使用一个递归函数,但我不知道,我在尝试时弄得一团糟,所以我决定创建两个方法,而不是使用一个,请不要在执行此操作时忽略代码格式。如果不是,它将导致您陷入困境,或者如果不是这样,将挫败您请求帮助的人。我没有测试您的代码,但知道您需要从两个方法中调用这两个方法。换句话说,
drawRulerLeft(…)
将需要调用
drawRulerLeft(…)
drawRulerRight(…)
,对于
drawRulerRight(…)
也是如此。还要注意的是,方法名称应该以小写字母开头,代码格式很重要,不应该被认为是理所当然的(正如您所做的那样)。使用左右方法的原因尚不清楚。为什么一个递归函数不能同时处理这两个子函数-problems@clwhisk:很好。@clwhisk是的,我确实想过只使用一个递归函数,但我不知道,我在尝试时弄得一团糟,所以我决定创建两个方法,而不是使用一个,请不要在执行此操作时忽略代码格式。如果不是的话,它会让你陷入困境,如果不是的话,它会让那些你要求帮助你的人感到沮丧。