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)
它不是一个无限的递归循环,因为它最终会停止.它停止是因为&&
操作员是短路操作员.在JLS,15.23节,描述了&&
运营商:
条件和运算符&&类似于&(§15.22.2),但仅在其左侧操作数的值为真时才计算其右侧操作数.
当递归达到一定水平,n
不大于2
,则&&
操作立即返回false
,而不评估右手边,这是递归调用.这有效地使情况n
不大于2
基本情况.然后先前的递归调用将其与!
运算符反转,返回true
.两个调用都返回true
,并true
打印两次.
值得注意的是,虽然这是一个非常深的递归,但堆栈大小足以处理这个问题.但是没有必要成为一个无限递归的循环StackOverflowError
.它所需要的只是足够的进行.通话isSuch(99999)
足以让StackOverflowError
我的信箱出现.
此外,如果您使用非短路运算符&
而不是&&
,那么它将是一个无限递归循环,StackOverflowError
无论最初传递的是什么数字都会发生isSuch
.