Просто сохраните его в переменную и не вызывайте его 2 раза:
Вот ваш код (при условии, что вы хотите умножить факториалы, а не И их)
static long doubleFactorial(int n) {
if (n == 0)
return 1;
System.out.println("DoubleFactorial(" + n + ") called");
long fact=doubleFactorial(n - 1);
return n * fact * fact;
}
Кроме того, было бы более эффективно, если вы удалите рекурсию (но вы, возможно, этого не захотите):
static long doubleFactorial(int n){
long ret=1;
for(int i=2;i<n;i++){
ret=i*ret*ret;
}
}
Это заменит рекурсию на al oop, что уменьшает количество вызовов метода и, следовательно, улучшает производительность.
Кроме того, он не создаст большой стек (и, возможно, StackOverflowError
s)