JAVA学习之方法递归
代码引出:
public class RecursionTest {
public static void main(String[] args) {
System.out.println("main begin");
doSome();
System.out.println("main over!");
}
public static void doSome() {
System.out.println("doSome begin");
doSome();
System.out.println("doSome over!");
}
}
IDEA出现以下错误警告:
Exception in thread "main" java.lang.StackOverflowError
at java.base/java.nio.ByteBuffer.position(ByteBuffer.java:1309)
at java.base/java.nio.ByteBuffer.position(ByteBuffer.java:266)
at java.base/sun.nio.cs.UTF_8.updatePositions(UTF_8.java:80)
at java.base/sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:509)
at java.base/sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:564)
at java.base/java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:585)
at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:301)
at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:290)
at java.base/sun.nio.cs.StreamEncoder.write(StreamEncoder.java:131)
at java.base/java.io.OutputStreamWriter.write(OutputStreamWriter.java:208)
at java.base/java.io.BufferedWriter.flushBuffer(BufferedWriter.java:120)
at java.base/java.io.PrintStream.writeln(PrintStream.java:722)
at java.base/java.io.PrintStream.println(PrintStream.java:1028)
at RecursionTest.doSome(RecursionTest.java:9)
at RecursionTest.doSome(RecursionTest.java:10)
........
递归的注意事项
1.什么是递归?
:方法自身调用自身。
a(){
a();
}
2.递归是很耗费栈内存的,递归算法能不用尽量别用。
3.递归必须要有结束条件,没有结束条件一定会引起栈的溢出错误
4.递归即使有了结束条件,即使结束条件是正确的,也可能会发生栈内溢出
递归求和
public class RecursionTest1 {
public static void main(String[] args) {
int n = 10;
int retValue = sum(n);
System.out.println(retValue);
}
public static int sum(int n){
if (n!=1){
return n + sum(n-1); //不停的返回递归的值(出栈)
}
return 1;
}
}
内存分析
递归的调用过程类似汇编中的中断过程。
把图片向左旋转90°就是栈的结构。