1

再帰に一致する単語を作成中ですが、問題が発生しました。ステートメントが true の場合に true を返す if ステートメントがあります。system.print 行をテストして、実際に正しく実行されたかどうかを確認します。ただし、メソッドが true を返すと想定されている場合は、false を返します。わかりにくい場合は申し訳ありませんが、私のコードがそれを解決してくれることを願っています。

public class A10 {

    public static int counter = 3;

    public static boolean match(String x, String y) {
        // If the x string's letter at place 'counter' is the same as y string's letter at place counter.
        if ((counter) >= x.length()) {
            System.out.println("RUNNING THIS METHOD");
            return true;
        }

        if (x.charAt(counter) == y.charAt(counter)) {
            counter++;
            match(x, y);
        }

        return false;

    }

    public static void main(String[] args) {
        System.out.println(match("asdfasdf", "asdfasdf"));
    }
}

実行すると、「RUNNING THIS METHOD」と出力されますが、true を返すはずのときに false が返されます... 誰かがこれの原因と修正方法を教えてもらえますか?

4

3 に答える 3

5

自分自身を再帰的にmatch()呼び出すと、戻り値は無視されます。

したがって、次のようになります。

       match(x, y);

する必要があります

       return match(x, y);

また、引数に変えて、状態counterを取り除くこともお勧めします。static

public static boolean match(String x, String y) {
    return match_helper(x, y, 0);
}

private static boolean match_helper(String x, String y, int counter) {
    if (counter >= x.length()) {
        return true;
    }

    if (x.charAt(counter) == y.charAt(counter)) {
        return match_helper(x, y, counter + 1);
    }

    return false;
}

public static void main(String[] args) {
    System.out.println(match("asdfasdf", "asdfasdf"));
}

の現在のバージョンはmatch()、誤って呼び出し間で状態を保持するため、複数回使用することはできません。上記の提案されたバージョンには、この欠陥はありません。

于 2013-04-02T07:27:03.737 に答える
2

return match(x, y);秒以内にする必要がありますif。これが再帰の主な原則です。

于 2013-04-02T07:27:48.143 に答える