0

宿題: 完全なコードではなく、より良い戦略またはアプローチを探しています。

この問題の再帰的なケースを特定しようとすると、私は完全に困惑します。整数パラメータ「n」を受け取り、合計「n」文字を出力するメソッドを作成する必要があります。中間の文字は、元の整数が奇数か偶数かに応じて、常に ' ' または ' *' にする必要があります。いくつかの異なるメソッド呼び出しと出力は次のようになります。

writeChars(1) -> *
writeChars(2) -> **
writeChars(3) -> <*>
writeChars(4) -> <**>
writeChars(5) -> <<*>>
writeChars(6) -> <<**>>
writeChars(7) -> <<<*>>>
writeChars(8) -> <<<**>>>

再帰的なケースを特定するにはどうすればよいですか?

4

5 に答える 5

2

n == 1 と n == 2 の 2 つの基本ケースがあります。それ以上の再帰規則は、「<」を発行し、n-2 で再帰します (このレベルで発行する 2 つの文字を説明するため)。 )、次に ">" を出力します。

于 2013-02-24T05:57:16.340 に答える
1

再帰を識別するには、最初に n の特定の値に対して問題を解決する方法を考えます。これは、より小さなケースで問題を解決する方法があることを前提としています。サイズ n の解は、サイズ n-1 の解とどのように関連していますか?

それを行った後、その方法では解決できない小さなケースが 1 つ以上見つかります。それらはあなたの基本的なケースです。

最後に、各基本ケースを直接実行するメソッドを作成します。n が基本ケースよりも大きい場合、n-1 を呼び出し、その結果を変更してサイズ n の解を取得します。

于 2013-02-24T06:10:14.573 に答える
0

私が再帰について考えた方法は、各再帰呼び出しを切り替える2つの状態(pos、string:s)と、次の状態を実現する方法を決定するのに役立つ3つの状態(n、mid1、mid2)を渡すことです。

    public static void main(String... arg) {
        int n = 10, mid1, mid2;
        if (n % 2 == 0) {
            mid1 = n / 2;
            mid2 = n / 2 + 1;
        } else {
            mid1 = mid2 = n / 2 + 1;
        }

        System.out.println(recursion(1, n, mid1, mid2, ""));
    }

    private static String recursion(int pos, final int n, final int mid1, final int mid2, String s) {
        if (pos > n)
            return s;
        else if (pos == mid1 || pos == mid2)
            return recursion(pos + 1, n, mid1, mid2, s + "*");
        else if (pos < mid1)
            return recursion(pos + 1, n, mid1, mid2, s + "<");
        else
            return recursion(pos + 1, n, mid1, mid2, s + ">");
    }
于 2013-02-24T06:24:40.113 に答える
0

おそらく問題を 3 つの部分に分割します 1. 印刷< 2. 印刷* 3. 印刷>

これに基づいて、各コンポーネントを印刷するための再帰的なソリューションを作成できます。<との数は>式に基づいているi % 2 == 1 ? i / 2 : (i - 2) / 2ので、それらを再帰的に出力する関数を記述してから、別の関数を記述して*s を出力できます。

public class SO15049082 {

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            print(i);
        }
    }

    private static void print(int i) {
        if (i > 0) {
            System.out.print("writeChars(" + i + ") --> ");
            int c = i % 2 == 1 ? i / 2 : (i - 2) / 2;
            printleft(c);
            printstar(c % 2);
            printright(c);
        }
        System.out.println();
    }

    private static void printright(int i) {
        if (i > 0) {
            System.out.print(">");
            printright(i - 1);
        }
    }

    private static void printstar(int i) {
        if (i == 1) {
            System.out.print("*");
        } else {
            System.out.print("**");
        }
    }

    private static void printleft(int i) {
        if (i > 0) {
            System.out.print("<");
            printleft(i - 1);
        }
    }

}
于 2013-02-24T06:14:38.827 に答える