1

这是我难以理解的行

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

我的理解是,如果第一种方法为假,它将调用后者。所以我写了一个简单的程序来测试。

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 4 6...

4

3 回答 3

3

如果左表达式或右表达式为真,则逻辑 OR 为真。如果左表达式为真,计算机语言可以选择不计算右表达式以节省时间。事实上,这正是 Java 所做的。

这意味着

match(regex, s.substring(1))

当且仅当

match(regex.substring(1), s)

是假的。

所以返回值为:

  • 如果match(regex.substring(1), s)返回 true,则为true,
  • match(regex, s.substring(1)否则的返回值
于 2013-03-04T00:35:57.543 回答
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 回答
0

您编写的程序以 5 作为参数调用 test。这将打印五个。这不大于 4 的 10,所以它转到 else。在 else 中,您递归地调用它自己的方法,第一次使用 4 。所以打印了 4 这返回了一个错误。然后它尝试第二个是 a+1,所以它用 6 调用 test。这会在屏幕上打印 6,通过 else,然后再次递归调用 test,用 a(现在是 6)-1 所以5。这个循环是无止境的。

你必须把第一个 if: 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 回答