IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scala Java Discussion :

Stack overflow lors du calcul des permutations d'une chaîne


Sujet :

Scala Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut Stack overflow lors du calcul des permutations d'une chaîne
    bonjour

    la méthode permutations2 devrait renvoyer toutes les permutations d'une string, mais j'ai une stack overflow error: (pour info la méthode permutations3 marche mais que avec des chaînes ne comportant pas de caractères répétés)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     implicit class utils(val chaîne: String) {
     
            def permutations2: Seq[String] =
            {
                if(chaîne.size == 1)
                    Seq(chaîne);
                else
                    chaîne.zipWithIndex.flatMap{case (x:Char,i:Int) => chaîne.drop(i).permutations2.map(x +_)}
     
            }
     
     
            def permutations3 : Seq[String] =
            {
                if(chaîne.size == 1)
                    Seq(chaîne)
                else
                    chaîne.flatMap(x => chaîne.filterNot(_ == x).permutations3.map(x +));
            }
        }
    pouvez-vous m'aider?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    j'y connais rien en scala, mais une stack overflow, c'est quand on fait un appel récursif "infini" : lorsque la stack java est pleine, on a l'overflow.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Es-tu sûr de l'emplacement ton flatMap ?

    Citation Envoyé par joel.drigo Voir le message
    j'y connais rien en scala, mais une stack overflow, c'est quand on fait un appel récursif "infini" : lorsque la stack java est pleine, on a l'overflow.
    tu voudrais un <= 1 au lieu du == 1 ?

    A priori, la partie en rouge ne contient pas d'appel récursif, comment va-t-elle faire un stack overflow ?


    Au passage, as-tu un exemple d'argument employé ?
    Sais-tu que la JVM n'a pas de quoi gérer des tail-call et que le compilateur scala ne sait pas toujours (pas souvent ^^) fabriquer une boucle à partir d'une définition récursive ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  4. #4
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    La méthode ne fait pas ce que tu penses. Elle supprime les i premiers éléments de la chaîne, au lieu de retirer uniquement l'élément d'indice i. En fait la méthode que tu cherches n'existe pas, je crois. Mais tu peux utiliser substring :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (chaîne.substring(0, i) + chaîne.substring(i+1)).permutations2.map(x + _)
    La raison pour laquelle ton code fait une stack overflow est la suivante : puisque drop(i) retire tous les i premiers éléments, lorsque i vaut 0, elle ne retire rien. chaîne.drop(0) == chaîne. Donc tu te rappelles récursivement avec la même chaîne, et ça n'en finit pas !

    PS : ça sent le devoir, donc c'est probablement interdit, mais si jamais il existe aussi la méthode... permutations ^^

    PS 2 : l'accent circonflexe dans chaîne, pour un identificateur, c'est quand même bof bof...

    PS 3 : mets une majuscule à ta classe Utils, et fais-la "extends AnyVal" pour éviter les créations d'instances inutiles.

    Voir aussi :
    http://www.scala-lang.org/api/curren...able.StringOps
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/07/2013, 05h56
  2. [WD14] Calcul des totaux d'une table dans un thread ?
    Par Fab.uzan dans le forum WinDev
    Réponses: 1
    Dernier message: 07/02/2011, 16h18
  3. calcul des arguments d'une ligne de commande
    Par dyngry dans le forum Langage
    Réponses: 3
    Dernier message: 01/02/2010, 11h50
  4. [MySQL] Calcul des articles d'une corbeille
    Par 3logy dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/11/2009, 18h01
  5. Calcul des attributs d'une région
    Par Wachter dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 29/01/2009, 09h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo