0

Java で再帰を導入する課題があり、障害に直面しています。割り当てには、渡された整数値に応じて、アスタリスクの数の行数を出力する再帰メソッドが必要です。たとえば、変数 n として 4 が渡された場合、出力は最初の行に 1 つのアスタリスク、次の行に 2 つのアスタリスク、次の 3 つのアスタリスク、次の 4、4、3、2、および 1 と続きます。

出力の前半を完了することができました (最適かどうかはわかりませんが) が、メソッドを元に戻す方法がわかりません。これはすべて、変数 (n) をメソッドに渡して 1 回のメソッド呼び出しで行う必要があります。

これが私がこれまでに持っている方法です:

    public static void myMethod(int n)
    {       
    if (n <= 1) {
            System.out.print("*");          
    } else {
        myMethod(n - 1);
        for (int i = 0; i < n; i++) {
            System.out.print("*");
        }
    }

    System.out.print("\n"); // new line
    }

次のように main から呼び出されます。

    myMethod(n);

だから私が持っているのは、同じ行に「n」回アスタリスクを出力する for ループです。for ループの後、次の行に進み、n を変更して循環します。しかし、私はそれを逆にする方法がわかりません。

私のメソッドはメソッドから印刷されます。インストラクターは、2 つの変数 (n) と NULL 文字列を渡すサンプル バージョンを見せてくれました。

    public static String myMethod(int n, String displayStr) {       
        String currentStr = "";

    for (int i = 0; i < n; i++)
        currentStr += "*";
        currentStr += "\n";

        if (displayStr == null){
            return myMethod((n - 1), currentStr);   
        } // end base case

        else if (n > 0){
            return myMethod((n - 1), (currentStr + displayStr + currentStr));
        }

        else {
            return displayStr;
        }
    } // end recursion method myMethod

彼のバージョンは、次のコード行を使用して main から出力されます。

    System.out.println(myMethod(n, null));

私は彼のバージョンを試してみましたが、その側に三角形が印刷されますが、最大の線は 2 回ではなく 1 回しか印刷されません。私は一日中彼を変更して真ん中に重複行を追加しようとしましたが、それは不可能だと考え始めています.

どんな助けでも大歓迎です。私はこれで完全に立ち往生しています。

4

3 に答える 3

0

基本的には、現在の行を印刷してから再帰呼び出しを行い、行を再度印刷するだけです。そうすれば、上に行く途中でスタックが蓄積され、下に行く途中で再びスタックが蓄積されます。

以下は、2 つのパラメーターを使用する例です。1 つは最大長で、もう 1 つは再帰の反復子です。

// bootstrap method to start the recursion
public static void myMethod(int length)
{
    myMethod(length, length);
}

public static void myMethod(int length, int i)
{
    if (i > 0)
    {
        int rowLength = length - i + 1;

        printRow(rowLength, '*');

        myMethod(length, i - 1);

        printRow(rowLength, '*');
    }
}

public static void printRow(int length, char symbol)
{
    for (int i = 0; i < length; i++)
        System.out.print(symbol);
    System.out.println();
}
于 2013-04-23T00:33:01.507 に答える