我试图在不使用java循环的情况下从1到10打印数字。当n + 1传递给第6行的recursivefun方法调用时,它工作正常。但是当传递n ++时,代码会抛出错误:/
public class PrintWithoutUsingLoops {
public static void recursivefun(int n) {
if (n <= 10) {
System.out.println(n);
recursivefun(n++);//an exception is thrown at this line.
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
recursivefun(1);
}
}
答案 0 :(得分:5)
recursivefun(n++);
将n
的原始值传递给递归调用(因为您正在使用后递增运算符),使此递归无限(因为每个递归调用都获得n
的相同值,永远不会达到11)并导致StackOverflowError
。
将其更改为
recursivefun(n+1);
或
recursivefun(++n);
答案 1 :(得分:1)
recursivefun(n++);
是post-increment
的来电。后增量是一种在读取后放大值的机制。在这种情况下,您总是传递1。
您可以使用pre-increment
++n
,StackOverflowError
首先:递增,然后传递值。
你得到的异常是UPDATE MyTable
SET columnName = REPLACE (columnName, '-', ':');
,这意味着堆栈已满,JVM无法在堆栈上存储更多的调用,因此无法恢复。
答案 2 :(得分:1)
recursivefun(n++);
此行表示:调用recursivefun(n);
然后递增n by 1
,这样您就可以使用n=1
调用您的函数并确保stackOverflow确定
所以你需要在所有函数之前增加n,你有一些选择:
recursivefun(n+1);
//-----------------------------
n++;
recursivefun(n);
//-----------------------------
recursivefun(++n); //pre-cincrement
答案 3 :(得分:0)
实际上,post和pre增量运算符都会增加变量的值。他们的行为会根据使用情况而变化。假设以下代码:
对于循环1: for(i = 0; i&lt; 10; i ++) ...
对于循环2: for(i = 0; i&lt; 10; ++ i) ...
在上述两个语句中,for循环迭代10次,与所使用的增量样式无关。但请考虑以下代码:
int x = 10;
int y = 20;
int z = x++ + ++y; // z = 10 + 21
System.out.println("x = " + x); // prints 11
System.out.println("y = " + y); // prints 21
System.out.println("z = " + z); // prints 31
因此,从您的代码中可以看出这一点 recursivefun(N ++);
无限地使用参数1调用recursivefun。要避免StackOverFlow错误,请使用++ n或n + 1。