Рекурсион хвоста с Groovy

I кодировал 3 факториальных алгоритма:

  1. Во-первых, я ожидаю провалиться переполнением стека. Без проблем.
  2. Во-вторых, я пытаюсь хвостовой призыв , преобразуйте предыдущий алгоритм от рекурсивного до итерации. Это не работает, но я не понимаю, почему .
  3. В-третьих, я использую метод батута () и работает нормально, как я ожидаю.

def factorial

factorial = { BigInteger n ->
    if (n == 1) return 1
    n * factorial(n - 1)
}
factorial(1000)  // Stack Overflow

factorial = { Integer n, BigInteger acc = 1 ->
    if (n == 1) return acc
    factorial(n - 1, n * acc)
}
factorial(1000)  // Stack Overflow, why???

factorial = { Integer n, BigInteger acc = 1 ->
     if (n == 1) return acc
     factorial.trampoline(n - 1, n * acc)
}.trampoline()
factorial(1000)  // It works
6
задан Arturo Herrero 10 September 2011 в 21:42
поделиться