46 votes

Anonyme en fonction récursive en Scala

Est-il possible d'écrire une fonction anonyme qui est récursif dans Scala? Je suis en train de penser à quelque chose comme ceci:

((t: Tree) => {
    print(t.value);
    for (c <- t.children)
        thisMethod(c)
})(root)

(Liés à la question: Qui prend en charge les langues *récursive* littéraux de fonction / fonctions anonymes?)

0voto

Lox Points 33

Pour compléter les propos de @in-ho-yi répondre . Pour plus de simplicité, vous pouvez définir directement une fonction locale à l'intérieur d'une fonction anonyme et l'utiliser pour la récursivité. L'utilisation de @tailrec avant la fonction locale, vous pouvez vous assurer qu'elle appliquera la récursivité de la queue, ce que vous ne pouvez pas faire avec le combinateur Y.

Cette approche est meilleure que celle de Y-combinator car elle n'ajoute que 2 frames à la pile et 1 par appel de la fonction (si elle n'est pas récursive, si elle l'est elle n'ajoutera que 1 au total donc 3 frames maximum seront utilisées) au lieu des 6 par appel que Y-combinator utilise.

import scala.annotation.tailrec

val fact = {(input: BigInt)=>
  @tailrec
  def f(x:BigInt, acc: BigInt = 1):BigInt = {
    if(x<=1) acc
    else f(x-1, x*acc)
  }
  f(input)
}

print(fact(1024))

-1voto

pvillela Points 366

Une approche très simple :

val fact = { (x: Int) =>
  def f(x: Int): Int = if (x == 0) 1 else x * f(x-1)
  f(x)
}

// Use as anonymous function below
(1 to 5).map { (x: Int) =>
  def f(x: Int): Int = if (x == 0) 1 else x * f(x-1)
  f(x)
}

// res0: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 6, 24, 120)

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