Question

Pourquoi pas scalac ( compilateur Scala) optimiser la récursion arrière ?

invocations de code et compilateur qui illustre cela:

> 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));
  }
}
Était-ce utile?

La solution

Les méthodes qui peuvent être surchargées ne peuvent pas être récursive queue. Essayez ceci:

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

Autres conseils

Essayez ceci:

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)

Notez que ifak peut récursive, mais il ne peut pas aussi bien. Marquez la classe ou la finale de la méthode, et il doit probablement fait récursive.

Fonctions intérieures sont également admissibles au coût total de possession.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top