Java支援尾遞歸調用,但是AFAIK并沒有優化它們。我認為這是Scala編譯器,隻是這樣做,而不是JVM本身。檢視Scala中的@tailrec注釋,看看編譯器能夠做些什麼呢:)
但是無論Java / JVM是否優化尾部遞歸,您的功能将比需要更難優化。
看這個:
int sum(List integers) {
return sum(integers, 0);
}
int sum(List integers, int sumSoFar) {
if (integers.isEmpty())
return sumSoFar;
else
return sum(
integers.subList(1, integers.size()),
sumSoFar + integers.get(0)
);
}
看到,我添加了一個過載的和與一個遠的計算的和參數。這樣,當您在else分支中重複出現時,您不需要實際的堆棧架構 – 您可以在遞歸調用中将所有需要作為函數參數。
在您的代碼片段中,隻要遞歸調用,堆棧架構可能必須存在。