Le programme suivant a été compilé et testé, il renvoie parfois le résultat et remplit parfois l'écran avec le programme: p> Mes questions: P> Détails: P> Scala Compiler Version 2.7.5.finale -
Copyright 2002-2009, Lampe / Scala EPFL
Code Runner version 2.7.5.final -
Copyright 2002-2009, Lampe / EPFL P>
Version Java "1.6.0_0" openjdk
Environnement d'exécution (construction
1.6.0_0-B11) OpenJDK Client VM (version 1.6.0_0-B11, mode mixte, partage) p>
Ubuntu 2.6.24-24-générique p>
blockQuote> p>
3 Réponses :
L'optimisation des appels de queue ne fonctionnera que dans scala si l'appel récursif est la dernière instruction dans la fonction. C'est très limité. Le livre Scala dit:
[...] l'optimisation des appels de queue est limité à des situations dans lesquelles un la méthode ou la fonction imbriquée s'appelle elle-même directement comme sa dernière opération, Sans traverser une valeur de fonction ou un autre intermédiaire. p> BlockQuote>
Dans votre cas, l'appel récursif fait partie d'une expression plus grande et n'est pas elle-même la dernière opération - la dernière opération ici est la multiplication. p>
Cet article montre comment le faire fonctionner: p> < Pré> xxx pré> p>
Je ne suis pas sûr que je comprenne, imprimée ne fait pas partie de la fonction factorielle ou n'est-ce pas?
Vous avez raison, j'ai mal interprété votre code (j'ai reformaté cela pour le rendre un peu plus clair et je mettrai à jour ma réponse).
Cela a fonctionné, bien fait, également merci pour le lien avec le grand article sur le sujet.
dans SCALAA 2.8 Vous pouvez utiliser l'annotation @TataileRec lorsque vous vous attendez à ce que l'optimisation de l'appel de la queue soit utilisée et obtenez un avertissement s'il n'est pas possible pour le compilateur de le faire. P>
Merci, as-tu utilisé? Je ne suis pas sûr qu'il ait encore été libéré. scala-lang.org/downloads
Si vous avez vraiment de grands nombres, il existe de nombreux , par exemple Celui-ci à Scala qui utilise la factorisation principale: utilisation: p>
Qu'entendez-vous par «ne pouvait pas voir la première ligne de cela»? Pouvez-vous piper la sortie dans un fichier?
@msiemeri, étrangement lorsque je "Scala Bigint> Fichier" ne fonctionne que lorsque le programme n'écrase pas.
Avez-vous essayé "Scala Bigint> Fichier 2> & 1" aussi? Avec 2> & 1, il redirige la sortie de STDRER à l'évier stdout (qui est dans ce cas, «fichier»).
Merci @MSIEMERI, édité la partie d'erreur.