为什么这会返回true,而不是堆栈溢出?

dad*_*tta 0 java recursion boolean-logic

为什么这不是一个无限的递归循环?

public static void main(String[] args) {
        System.out.println(isSuch(99) + " " + isSuch(100));
    }

    public static boolean isSuch(int n)
   {
      System.out.println("n is currently at "+ n);
       return n > 2 && !isSuch(n - 2);

    }
Run Code Online (Sandbox Code Playgroud)

rge*_*man 5

它不是一个无限的递归循环,因为它最终会停止.它停止是因为&&操作员是短路操作员.在JLS,15.23节,描述了&&运营商:

条件和运算符&&类似于&(§15.22.2),但仅在其左侧操作数的值为真时才计算其右侧操作数.

当递归达到一定水平,n不大于2,则&&操作立即返回false ,而不评估右手边,这是递归调用.这有效地使情况n不大于2基本情况.然后先前的递归调用将其与!运算符反转,返回true.两个调用都返回true,并true打印两次.

值得注意的是,虽然这是一个非常深的递归,但堆栈大小足以处理这个问题.但是没有必要成为一个无限递归的循环StackOverflowError.它所需要的只是足够的进行.通话isSuch(99999)足以让StackOverflowError我的信箱出现.

此外,如果您使用非短路运算符&而不是&&,那么它将是一个无限递归循环,StackOverflowError无论最初传递的是什么数字都会发生isSuch.