因此,我正在学习Java,并且作为第一个练习,我决定编写两个小且可组合的函数,即fibbonacci和阶乘函数,它们具有常见的实现细节,但是当我尝试时会收到堆栈溢出异常将它们的共同部分分离为一个单独的功能。关于我在做什么错的任何提示吗?
public class BaseFunctions{
static Integer factorial(Integer num) {
return factorial(comComponent(num)-1)*num;
}
static Integer fibbonacci(Integer num) {
return fibbonacci(comComponent(num)-1) + fibbonacci(comComponent(num)-2);
}
static Integer comComponent(Integer num) {
if(num == 1 || num == 0) {
return 1;
}else if(num < 0){
throw new ArithmeticException("Num must be > 0");
}else return num;
}
}
答案 0 :(得分:2)
到达num = 0
时,comComponent
将返回1,再次用num = 0
调用函数,从而陷入无限循环。
答案 1 :(得分:1)
递归函数必须具有一个退出点(必须在任何递归调用之前首先进行检查),否则将导致堆栈溢出。
您要做的就是让该函数没有该退出点,将此功能委托给comComponent()
。
但是,请看一下factorial()
中的代码:
return factorial(comComponent(num)-1)*num;
为什么要停止?没有return
语句而没有递归调用。
所以你的逻辑是错误的。
放下comComponent()
并遵循传统方式:
static Integer factorial(Integer num) {
if (num == 1 || num == 0)
return 1;
else if (num < 0)
throw new ArithmeticException("Num must be > 0");
else
return factorial(num - 1) * num;
}
static Integer fibbonacci(Integer num) {
if (num == 1 || num == 0)
return 1;
else if (num < 0)
throw new ArithmeticException("Num must be > 0");
else
return fibbonacci(num - 1) + fibbonacci(num - 2);
}
如您所见,两个函数都有一个出口点:
if (num == 1 || num == 0)
return 1;