Следующая программа была скомпилирована и протестирована, она иногда возвращает результат и иногда заполняет экран с помощью
java.lang.StackOverflowError
at scala.BigInt$.apply(BigInt.scala:47)
at scala.BigInt.equals(BigInt.scala:129)
at scala.runtime.BoxesRunTime.equals(Unknown Source)
at bigint$.factorial(fact2.scala:3)
at bigint$.factorial(fact2.scala:3)
...
Программа:
object bigint extends Application {
def factorial(n: BigInt): BigInt = if (n == 0) 1 else n * factorial(n-1)
println("4391! = "+factorial(4391))
}
Мои вопросы:
- Это потому, что на JVM существует переполнение стека, которое иногда происходит, а иногда нет?
- Является ли это недетерминированное поведение ошибкой?
- Я предполагаю, что Scala не вернул хвост? как я могу сделать это с помощью хвоста?
Подробнее:
Scala версия компилятора 2.7.5.final - Copyright 2002-2009, LAMP/EPFL Scalaкод runner version 2.7.5.final - Copyright 2002-2009, LAMP/EPFL
java version "1.6.0_0" OpenJDK Среда выполнения (build 1.6.0_0-b11) OpenJDK Client VM (сборка 1.6.0_0-b11, смешанный режим, совместное использование)
Ubuntu 2.6.24-24-generic