我对以下代码有疑问:
public class Recursividad1 {
public static void main(String[] args) {
System.out.println("El factorial es: "+NumeroEntero.getFactorial(5));
System.out.println("El factorial es: "+NumeroEntero.getPotencia(5, 2));
}
}
这是递归方法所在的类:
public class NumeroEntero {
private static int devuelveFactorial(int numero) {
if (numero == 0) {
return 1;
} else {
return numero * devuelveFactorial(numero--);
}
}
private static int devuelvePotencia(int valor, int potencia) {
if (potencia == 0) {
return 1;
} else {
return valor * devuelvePotencia(valor,potencia--);
}
}
public static int getPotencia(int valor2, int potencia2){
return devuelvePotencia(valor2, potencia2);
}
public static int getFactorial(int numero2){
return devuelveFactorial(numero2);
}
}
什么是堆栈?
java中的栈是一个栈,其中存储了引用方法执行的数据(内部变量等)。
什么是 StackOverflow?
每次进行方法调用时,都会在堆栈上分配内存。考虑到内存是有限的,这个内存总是有可能会被填满。
当该内存已满并且您再次调用另一个新方法时,JRE 无法将必要的数据保存在内存中,因为它已满,即 StackOverflow 启动时。
为什么它会出现在递归调用中?
从前一点您可能已经意识到,理论上,强制 StackOverflow 很容易。好的部分是,在 java 中,有很多优化,无论是在垃圾收集器还是在编译器端,以避免类似的事情发生。
然而,无法避免的一点是递归调用:
这通常不是问题,因为方法之间通常没有很长的调用队列,但是在无限递归调用中,堆栈很快就会填满。
这就是为什么留下一个越来越接近琐碎情况的回报是非常重要的,在你的练习中是
numero == 0
。你的错误是什么?
您的错误发生在这一行:
肉眼不易捕捉。问题在于,这样做
numero--
是在应用post-decrement。也就是java会先执行return,返回结果后,递减 的值numero
,但为时已晚。修复它就像将后减量更改为 a 一样简单
numero - 1
: