1

これは私が理解するのに苦労している線です

return (match(regex.substring(1), s)|| match(regex, s.substring(1)));

私の理解では、最初のメソッドがfalseの場合、後者が呼び出されます。そこで、テストする簡単なプログラムを作成しました。

public static void main(String[] args)
{
   System.out.println(test(5));
}

public static boolean test(int a)
{
    System.out.println(a);
    if (a>10)
        return true;
    if (a==4)
        return false;
    else
        return (test(a-1) || (test(a+1)));
}

しかし、それは5 4 6 5 46..を出力するだけです。

4

3 に答える 3

3

左または右の式のいずれかが真の場合、論理ORは真です。左の式が真の場合、コンピューター言語は時間を節約するために右の式を評価しないことを選択できます。つまり、実際には、Javaが行うこととまったく同じです。

つまり、

match(regex, s.substring(1))

次の場合にのみ実行されます

match(regex.substring(1), s)

は偽です。

したがって、戻り値は次のとおりです。

  • truematch(regex.substring(1), s)を返す場合はtrue、
  • match(regex, s.substring(1)それ以外の場合の戻り値
于 2013-03-04T00:35:57.543 に答える
0

あなたが書いたプログラムは、パラメータとして5を使用してtestを呼び出します。これは5つを印刷します。これは4の10より大きくないので、他に行きます。それ以外の場合は、最初に4を使用して、独自のメソッドを再帰的に呼び出します。したがって、4が出力されます。これはfalseを返します。次に、a + 1である2番目を試行するため、6を使用してtestを呼び出します。これにより、画面に6が出力され、elseにフォールスルーし、(現在は6)-1を使用してtestを再帰的に呼び出します。このループは無限です。

次の場合は最初に入力する必要があります:if(a == 4)

これによりプログラムは修正されますが、取得したいものは修正されません。

また、問題は、論理的または完全に間違ったものを使用していることです。ORは、両方の答えのいずれかが真であるかどうかを確認することを意味します。状況に応じてメソッドを呼び出したい場合は、ifまたは三項演算子を使用する必要があります。

public static void main(String[] args)
{
   System.out.println(test(5));
}

public static boolean test(int a)
{
    System.out.println(a);
    if (a>10)
        return true;
    if (a==4)
        return false;
    else
        if(test(a-1)) {
            return test(a-1);
        }
        else {
            return (test(a+1));
        }
}

これはあなたが望むものをあなたに与えるはずです私は推測します

于 2013-03-04T00:50:31.157 に答える
0

それは以下と同等です:

if match(regex.substring(1), s) return true;
if match(regex, s.substring(1)) return true;
return false;
于 2013-03-04T00:40:30.357 に答える