J'ai écrit une simple recherche en profondeur d'abord à Scala avec une fonction récursive comme ça:Briser ou court-circuiter un pli dans Scala
search(labyrinth, path, goal)
où labyrinthe est une spécification du problème (comme graphique ou autre), path est une liste qui contient le chemin parcouru jusqu'à présent et l'objectif est une spécification de l'état du but. La fonction renvoie un chemin vers le but sous la forme Liste et Nul si aucun chemin ne peut être trouvé.
La fonction se développe, par ex. trouve tous les prochains noeuds appropriés (candidats) et doit ensuite s'appeler récursivement.
Je le fais par
candidates.foldLeft(Nil){
(solution, next) =>
if(solution == Nil)
search(labyrinth, next :: path, goal)
else
solution
}
S'il vous plaît noter que j'ai omis quelques détails unescessary. Tout fonctionne bien jusqu'à présent. Mais une fois qu'une solution est trouvée dans l'appel foldLeft, cette solution est simplement copiée par la partie else de l'instruction if. Y at-il un moyen d'éviter cela en cassant foldLeft ou peut-être en utilisant une fonction différente au lieu de foldLeft? En fait, je pourrais probablement écrire une version de foldLeft qui se casse une fois que "not Nil" est retourné moi-même. Mais y a-t-il un dans l'API?
Qu'essayez-vous d'éviter exactement? Il n'y a pas de copie en cours. – Apocalisp
ne va-t-il pas effectuer au moins un appel de fonction pour chaque élément restant dans la liste? –
Avec le foldLeft, oui. Mais, encore une fois, foldLeft est en train de faire quelque chose pour lequel il n'était pas destiné. –