Хвостовая рекурсия с Groovy
Я кодировал 3 факторных алгоритма:
Во-первых, я ожидаю провала из-за переполнения стека. Нет проблем.Во вторых я стараюсьрекурсивный вызов, преобразуйте предыдущий алгоритм из рекурсивного в итеративный.Это не работает, но я не понимаю, почему.В-третьих, я используюtrampoline()
метод и работает нормально, как я ожидаю.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