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()方法