如果我用参数0,0,0,15输入这个,我得到一个堆栈溢出异常..这可能是什么原因?是无限递归还是堆栈实际上太多了?照明3D阵列的尺寸为16 * 16 * 128
private void updateLight(int x, int y, int z, byte lightValue) {
if (lightValue == 1 || lighting[x][z][y] != -1 || voxels[x][z][y] != 0) {
return;
}
lighting[x][z][y] = lightValue;
if (x - 1 >= 0) {
updateLight(x - 1, y, z, --lightValue);
}
if (x + 1 < lighting.length) {
updateLight(x + 1, y, z, --lightValue);
}
if (z - 1 >= 0) {
updateLight(x, y, z - 1, --lightValue);
}
if (z + 1 < lighting[0].length) {
updateLight(x, y, z + 1, --lightValue);
}
if (y - 1 >= 0) {
updateLight(x, y - 1, z, --lightValue);
}
if (y + 1 < lighting[0][0].length) {
updateLight(x, y + 1, z, --lightValue);
}
}
答案 0 :(得分:2)
看起来第一个调用将达到第二个条件,并调用updateLight(x + 1, y, z, --lightValue);
updateLight(1, 0, 0, 14);
。然后,该递归调用将达到第一个条件,并调用updateLight(x - 1, y, z, --lightValue);
updateLight(0, 0, 0, 13);
。由于所有条件都不依赖于lightValue,因此就流量控制而言,这与第一次调用相同。所以它只是在这两个递归调用之间来回反复,直到堆栈溢出。
您应该能够在调试器中轻松验证这一点。