Java 为什么返回true而不是堆栈溢出?

Java 为什么返回true而不是堆栈溢出?,java,recursion,boolean-logic,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 &&am

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

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);

    }

它不是一个无限递归循环,因为它最终会停止。由于
&&
操作员是短路操作员,因此停止。描述了
&&
运算符:

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

当递归达到
n
不大于
2
的级别时,
&&
操作符立即返回
false
,而不计算右侧,这是递归调用。这有效地使
n
不大于
2
的情况成为基本情况。然后,前面的递归调用使用
将其反转运算符,返回
true
。两个调用都返回
true
,并且
true
被打印两次

值得注意的是,虽然这是一个相当深的递归,但堆栈大小足以处理这个问题。但是,要发生
StackOverflowerError
,不需要无限递归循环。它所需要的只是递归足够远。调用
isSuch(99999)
就足以在我的箱子上造成
stackoverflower错误


此外,如果您使用了非短路运算符
&
而不是
&
,那么它将是一个无限递归循环,并且无论最初传递给
isSuch
的是什么数字,
堆栈溢出错误将发生,因为它不是一个无限递归循环,因为它最终将停止。由于
&&
操作员是短路操作员,因此停止。描述了
&&
运算符:

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

当递归达到
n
不大于
2
的级别时,
&&
操作符立即返回
false
,而不计算右侧,这是递归调用。这有效地使
n
不大于
2
的情况成为基本情况。然后,前面的递归调用使用
将其反转运算符,返回
true
。两个调用都返回
true
,并且
true
被打印两次

值得注意的是,虽然这是一个相当深的递归,但堆栈大小足以处理这个问题。但是,要发生
StackOverflowerError
,不需要无限递归循环。它所需要的只是递归足够远。调用
isSuch(99999)
就足以在我的箱子上造成
stackoverflower错误

此外,如果您使用了非短路运算符
&
而不是
&
,那么它将是一个无限递归循环,并且无论最初传递给
isSuch
的是什么数字,都会发生
堆栈溢出错误

短路逻辑运算符

当第一个操作数为真时,运算符的结果为真,否 不管第二个操作数是什么。运算符会导致 false当第一个操作数为false时,无论第二个操作数是什么 是如果使用|&&&,Java将不会计算 右操作数,当结果可以由左操作数确定时 仅操作数

在示例代码中,当n的值等于2时,条件
**n>2&&!ISUCH(n-2)**
立即变为false,因为第一个操作数为false,所以不会计算下一个操作数,因此不会调用ISUCH()方法

短路逻辑运算符

当第一个操作数为真时,运算符的结果为真,否 不管第二个操作数是什么。运算符会导致 false当第一个操作数为false时,无论第二个操作数是什么 是如果使用|&&&,Java将不会计算 右操作数,当结果可以由左操作数确定时 仅操作数

在示例代码中,当n的值等于2时,条件
**n>2&&!ISUCH(n-2)**
立即变为false,因为第一个操作数为false,所以不会计算下一个操作数,因此不会调用ISUCH()方法