1

相互に再帰的な 2 つのメソッドを持つプログラムを使用し、そのプログラムを修正して、単一の再帰的なメソッドを含める必要があります。私が理解していることから、再帰呼び出しを呼び出された順序で単一のメソッドに配置することにより、2 つの再帰メソッドを組み合わせる必要があります。問題は、メソッドを介して渡される 4 つの整数があり、最初のメソッドが 2 番目のメソッドを 2 回呼び出し、2 番目のメソッドが最初のメソッドを 2 回呼び出すことです。

これは元のコードです:

public void drawHorizontal(Graphics graphics, double xMid, double yMid, double length )
{
    // find left endpoint
    double x1 = xMid - (length / 2);
    double y1 = yMid;

    // find right endpoint
    double x2 = xMid + (length / 2);
    double y2 = yMid;

   if (length > 5)
    {
    // draw a line from (x1,y1) to (x2,y2)
    graphics.drawLine((int) x1, (int) y1, (int) x2, (int) y2);

    // draw a vertical line with left end of horizontal as  midpoint of new line
    drawVertical(graphics, x1, y1, (length) );

    // draw a vertical line with right endof horizontal as  midpoint of new line
    drawVertical(graphics, x2, y2, (length) );
    }     

} // end drawHorizontal()

public void drawVertical(Graphics graphics, double xMid, double yMid, double length )
{
    // find upper endpoint
    double x1 = xMid; 
    double y1 = yMid - (length / 2);

    // right lower endpoint
    double x2 = xMid;
    double y2 = yMid + (length / 2);


   if (length > 5)
    {
    // draw a line from (x1,y1) to (x2,y2)
    graphics.drawLine((int) x1, (int) y1, (int) x2, (int) y2);

    // draw a 1/2 size horizontal line with top end of vertical as  midpoint of new line
    drawHorizontal(graphics, x1, y1, (length/2) );

    // draw a 1/2 horizontal line with bottom end of vertical as  midpoint of new line
    drawHorizontal(graphics, x2, y2, (length/2) );
    }

} // end drawVertical()

以下は、私の最新の変更されたコードです。醜いことはわかっていますが、x座標とy座標を互いに独立して調整する方法がわかりません。より多くの変数を作成してこれを修正しようとしましたが、より多くの作業を行っているだけだと感じずにはいられません。私が見つけた最も近いスタックの質問はthisでした。11時からやっていて、今4時15分です。正しい方向への微調整は大歓迎です。お時間をいただきありがとうございます。

編集 * 迅速な返信ありがとうございます。相互に再帰的なメソッドをこのように分割するのは直観に反するように思えますが、プログラミングと Java は初めてなので、問題を分割するさまざまな方法を模索しています。これは私が最終的に分解したもので、問題なく動作します。お時間をいただきありがとうございます。

変更されたコード:

    public void Total(Graphics graphics, boolean type, double xMid, double yMid, double length) {

    double x1;
    double y1;

    // find right endpoint
    double x2;
    double y2;

    if (type == false) {
        // find left endpoint
        x1 = xMid - (length / 2);
        y1 = yMid;

        // find right endpoint
        x2 = xMid + (length / 2);
        y2 = yMid;

        if (length > 5) {
            // draw a line from (x1,y1) to (x2,y2)
            graphics.drawLine((int) x1, (int) y1, (int) x2, (int) y2);

            // draw a vertical line with left end of horizontal as  midpoint of new line
            Total(graphics, true, x1, y1, (length));

            // draw a vertical line with right endof horizontal as  midpoint of new line
            Total(graphics, true, x2, y2, (length));
        }
    } else {

        // find upper endpoint
        x1 = xMid;
        y1 = yMid - (length / 2);

        // right lower endpoint
        x2 = xMid;
        y2 = yMid + (length / 2);

        if (length > 5) {
            // draw a line from (x1,y1) to (x2,y2)
            graphics.drawLine((int) x1, (int) y1, (int) x2, (int) y2);

            // draw a 1/2 size horizontal line with top end of vertical as  midpoint of new line
            Total(graphics, false, x1, y1, (length / 2));

            // draw a 1/2 horizontal line with bottom end of vertical as  midpoint of new line
            Total(graphics, false, x2, y2, (length / 2));
        }
    }
} 
4

1 に答える 1

1

あなたの要求は奇妙です。相互再帰は一般的に読書に役立ちます...しかし、わかりました、これには(少なくとも)1つの一般的な方法があります。あなたが持っている場合:

f(f_params) {
  …
  g(g_params…);
  …
}
g(g_params) {
  …
  f(f_params…);
  …
}

次のように変換できます。

fg(what,f_params,g_params) {
  if (what==FUNC_F) {
    …
    fg(FUNC_G,f_params,g_params);
    …
  } else if (what==FUNC_G) {
    …
    fg(FUNG_F,f_params,g_params);
    …
  }
}

さまざまな戻り値の型を管理する必要がある場合は、もう少し複雑です。戻り値/型に対応するいくつかの出力パラメーターを追加するだけです。

于 2015-07-10T08:38:50.763 に答える