Il seguente programma, è stato compilato e testato, a volte restituire il risultato, e, a volte riempie lo schermo conScala fattoriale sui grandi numeri a volte si blocca e, a volte non si
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)
...
Il programma:
object bigint extends Application {
def factorial(n: BigInt): BigInt = if (n == 0) 1 else n * factorial(n-1)
println("4391! = "+factorial(4391))
}
le mie domande:
- è perché c'è un overflow dello stack sulla JVM, che a volte accade e someti mes non lo fa?
- Questo comportamento non deterministico è considerato un errore?
- Presumo che Scala non si sia comportato in modo anomalo? come posso farlo tail-recurse this?
Dettagli:
Scala versione del compilatore 2.7.5.final - Copyright 2002-2009, LAMP/EPFL Scala codice di versione corridore 2.7.5.final - copyright 2002-2009 , LAMP/EPFL
versione java "1.6.0_0" OpenJDK Runtime Environment (build 1.6.0_0-b11) OpenJDK client VM (build 1.6.0_0-b11, modalità mista, condivisione)
Ubuntu 2.6.24-24-generic
Che cosa si intende per "couldn' vedere la prima riga di questo "? Riesci a canalizzare l'output in un file? – msi
@msiemeri, stranamente quando I "scala bigint> file" funziona solo quando il programma non si schiaccia. –
Hai provato anche "scala bigint> file 2> & 1"? Con 2> & 1 reindirizza l'output di stderr al sink stdout (che è, in questo caso, 'file'). – msi