我运行了一个java程序并得到了一个stackoverflow error
,这个错误是在digamma函数中引起的,代码是
public static double digamma(double x) {
if (x >= 0 && x < GAMMA_MINX) {
x = GAMMA_MINX;
}
if (x < DIGAMMA_MINNEGX) {
return digamma(DIGAMMA_MINNEGX + GAMMA_MINX);
}
if (x > 0 && x <= S_LIMIT) {
return -GAMMA - 1 / x;
}
if (x >= C_LIMIT) {
double inv = 1 / (x * x);
return Math.log(x) - 0.5 / x - inv
* ((1.0 / 12) + inv * (1.0 / 120 - inv / 252));
}
return digamma(x + 1) - 1 / x;
}
常量定义如下(private static final
出于空间考虑,省略了)
double GAMMA = 0.577215664901532860606512090082;
double GAMMA_MINX = 1.e-12;
double DIGAMMA_MINNEGX = -1250;
double C_LIMIT = 49;
double S_LIMIT = 1e-5;
由于stackoverflow error
递归级别太深以至于超过线程的堆栈大小(对吗?)所以我将Xss
参数增加到20M
,但错误仍然存在,所以我认为我必须将其重写为非递归,但我没有将递归函数重写为非递归函数的经验。