【问题标题】:Recursive methods - Ruler tick marks递归方法 - 标尺刻度线
【发布时间】:2013-10-22 02:54:01
【问题描述】:

今天我正在研究一种将刻度线放置在标尺上的递归方法。作业说放置刻度线并打印它的高度和位置。假设 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 );
         }

    }

【问题讨论】:

  • 我没有测试过您的代码,但知道您需要在这两种方法中调用这两种方法。换句话说,drawRulerLeft(...) 需要同时调用drawRulerLeft(...) drawRulerRight(...)drawRulerRight(...) 也是如此。另请注意,方法名称应以小写字母开头,并且代码格式很重要,不应视为理所当然(正如您所做的那样)。
  • 有左右方法的原因不清楚。为什么一个递归函数不能同时处理这两个子问题
  • @clwhisk:好点。
  • @clwhisk 是的,我实际上想过只使用一个递归函数,但我不知道,当我尝试它时弄得一团糟,所以我决定改为创建两种方法
  • 用一个,在你这样做的时候请不要忽略代码格式。如果不是,它会导致你搞砸,或者如果不是这样,会让你要求帮助你的人感到沮丧。

标签: java methods recursion


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    基本操作是在区间中间画一个高度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 );
    

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

    【讨论】:

      【解决方案3】:

      类似于两半的二进制遍历,试试这个方法:-

      //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 的高度在下降一个级别时减半。我的建议是深度优先中序遍历,但您也可以使用广度优先遍历。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-01
        • 1970-01-01
        • 2011-03-30
        • 2021-06-14
        • 1970-01-01
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多