BigInteger.subtract генерирует новый BigInteger, который вы помещаете в стек.
Но исходное число остается прежним, поэтому условие! Number.equals (BigInteger.ONE) никогда не будет истинным.
Таким образом, вы навсегда заполняете стек копиями числа 1, пока не закончится память
Отредактировано (снова):
Обратите внимание, чтоэто также очень требовательный к памяти способ вычисления факториала, так как вам нужно поместить N значений в стек, чтобы вычислить N!Умножать их по мере продвижения было бы лучше, хотя, конечно, вам не нужен большой N, прежде чем факториал действительно станет очень большим.
См. http://en.wikipedia.org/wiki/Factorial для некоторых деталей по эффективному вычислению больших факториалов..