8 votes

Pourquoi scalac ne peut-il pas optimiser la récursion de queue dans certains scénarios ?

Pourquoi scalac (le Scala compilateur) optimiser la récursion de la queue ?

Le code et les invocations du compilateur qui le démontrent :

\> cat foo.scala 
class Foo {
 def ifak(n: Int, acc: Int):Int = {  
   if (n == 1) acc  
   else ifak(n-1, n\*acc)  
 }
}

> scalac foo.scala
> jd-gui Foo.class
import scala.ScalaObject;

public class Foo
  implements ScalaObject
{
  public int ifak(int n, int acc)
  {
    return ((n == 1) ? acc : 
      ifak(n - 1, n \* acc));
  }
}

12voto

Walter Chang Points 7041

Les méthodes qui peuvent être surchargées ne peuvent PAS être récursives à la queue. Essayez ceci :

class Foo {
  private def ifak(n: Int, acc: Int): Int = {  
    if (n == 1) acc  
    else ifak(n-1, n*acc)  
  }
}

1voto

Daniel C. Sobral Points 159554

Essayez ça :

class Foo {
  def ifak(n: Int, acc: Int):Int = {
    if (n == 1) acc
    else ifak(n-1, n*acc)
  }
}

class Bar extends Foo {
  override def ifak(n: Int, acc: Int): Int = {
    println("Bar!")
    super.ifak(n, acc)
  }
}

val foobar = new Bar
foobar.ifak(5, 1)

Remarquez que ifak mai être récursif, mais il peut aussi ne pas l'être. Marquez la classe ou la méthode comme finale, et elle sera probablement rendue récursive à la queue.

0voto

Randall Schulz Points 18820

Les fonctions internes sont également éligibles au TCO.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X