2013-10-22 85 views
1

今天我正在使用遞歸方法將刻度線放在標尺上。作業表示放置刻度線並打印其高度和位置。假設X &ý爲(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); 
     } 

    } 
+1

我沒有測試過你的代碼,但知道你需要從兩種方法中調用兩種方法。換句話說,'drawRulerLeft(...)'需要同時調用'drawRulerLeft(...)'*和*'drawRulerRight(...)','drawRulerRight(...)'也是一樣的。另請注意,方法名稱應以小寫字母開頭,並且代碼格式很重要,不應視爲理所當然(正如您所做的那樣)。 –

+1

有左右方法的原因尚不清楚。爲什麼一個遞歸函數不能處理這兩個子問題 – clwhisk

+0

@clwhisk:好點。 –

回答

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 
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); 
} 

的問題類似於建築物的tick高度而下降的水平減半BST。我的建議是深度優先的順序遍歷,但您也可以使用寬度優先遍歷。

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); 

現在,從這個設置你可能找出需要旁邊畫一半的高度的所有蜱做什麼。