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

Langage Java Discussion :

Boucles for imbriquées


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 64
    Points : 37
    Points
    37
    Par défaut Boucles for imbriquées
    Bonsoir.
    J'ai une question sur des boucles for imbriquées.
    Lors de l'exécution d'un programme java, un entier n prend une valeur de façon dynamique, et ensuite j'aimerais faire n boucles for imbriquées. Est-ce que c'est possible en java?
    Sinon comment faire?
    merci.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Au dela du fait que tu n'a pas l'air de réaliser à quel point ton temps de calcul va exploser au delà du chiffre 5, il faut faire de la récursivité:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public int boucler(int boucles, int profondeur, int valeur){
        if (profondeur>1)
        for (int i=0;i<boucles;i++){
             valeur=boucler(boucles,profondeur-1,valeur);
        }
    }

  3. #3
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Bonjour,

    Pourrais tu nous dire pour quelles raisons tu souhaites faire n boucles imbriquées..... peut être y a t il une meilleur solution !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Tu veux coder une fonction ackermann ?

    Cordialement,
    Patrick Kolodziejczyk.

    source :
    http://en.wikipedia.org/wiki/Ackermann_function
    www.youtube.com/watch?v=i7sm9dzFtEI
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 64
    Points : 37
    Points
    37
    Par défaut
    Si,si, je réalise bien que le temps de calcul explose.

    C'est pour générer tous les entiers à n chiffres distincts.
    Si n est fixé dès le départ, je pense que le plus efficace (nombre de calculs, occupation mémoire), c'est n boucles for imbriquées.
    Par contre si n est initialisé au cours du programme, j'utilise la récursivité (ça ressemble un peu à la proposition de tchize):
    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
    void entierNChiffres(int niveau) {
    	for(int i=0; i<10; i++) {
    		int j = 0;
    		while (j <niveau && i != entier[j]) j++;
    		if (!(i==0 && niveau==1)  && j==niveau) {
    			entier[niveau-1] = i;
               	if (niveau == nbChiffres) affiche(entier);
                	else entierNChiffres(niveau+1);
    		}
    	}
    }
    void main(){
    	nbChiffres = 3;
     
    	entier = new int[nbChiffres];
    	for(int i=0; i<nbChiffres;i++) entier[i] = -1;
    	entierNChiffres(1);
    }

    Mais je me demandais si il n'y avait pas mieux au niveau nombre de calculs et mémoire (en évitant la récursivité par exemple).

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    En gros tu cherche toutes les combinaisons de 10 éléments parmis 10 où l'ordre à de l'importance, ça s'appelle un arrangement et effectivement la méthode la plus simple pour le résoudre c'est récursif, de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    arrangements(elements[])
      si elements vide, retourner le vide
      pour chaque element e de elements
        resultat = resultat U (e + arrangements(elements-e))
      retourner resultat
    tout simplement

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 64
    Points : 37
    Points
    37
    Par défaut
    Désolé Tchize mais je trouve ta solution moins bonne que la mienne:
    Pour renvoyer un arrangement (là je dirais plutôt permutation) de n éléments, ta fonction calcule les permutations de n-1 éléments, n-2 éléments... qui sont stockées en mémoire.
    Donc grosse occupation mémoire et beaucoup de calculs.
    Ma solution travaille sur une variable globale qui est modifiée à chaque appel récursif (donc peu d'occupation mémoire) et beaucoup moins de calculs.
    Mais est-ce qu'il n'y aurait pas une méthode encore meilleure, non récursive ?

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Oui, c'est du pseudo code, tu peux le faire fonctionner comme ça si tu préfère:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    arrangements(partiel, elements[])
      si elements vide, afficher partiel
      pour chaque element e de elements
        arrangements(partiel+e,elements-e))
      retourner resultat
    Effectivement, ton code évite de tenir à jour la liste des éléments. Mais en contre partie, à chaque fois, il relit tous les éléments déjà placé. Mais vu qu'on ne peux pas placer plus de 10 éléments au total, je pense que ta méthode est plus rapide, même si a mes yeux plus difficile à lire

  9. #9
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Mais est-ce qu'il n'y aurait pas une méthode encore meilleure, non récursive ?
    Ton approche est itérative. Ce qui revient au même au niveau de la complexité.

    Point de vue performance, il est très peu probable que l'une ou l’autre des méthodes ai un impacte important sur la mémoire.
    A partir du moment qu'on à un n relativement grand, ce qui va prendre de la place en mémoire, c'est le résultat. Après si N est petit et que tu considère que 2Mo en plus c'est beaucoup, n'oublie pas que tu lance l'ensemble de la JVM pour lancer ton programme.

    Le récursif n'ayant jamais de doublon en mémoire, celui-ci n'explose pas la mémoire dans ce contexte. La seule limite étant le nombre d'appel récursif, limité par la taille de la pile d'appel.
    Lors la méthode récursive proposé par tchize_ est d'avoir N récursion. (10 dans ton cas).
    Où l'ensemble des combinaisons de niveau N sont celle de longueur N et les combinaisons de N-1
    Il y aurai des problèmes de mémoire et de performance si tu commence à dupliquer tes set de données à chaque boucle ou récusions. Ce qui n'est pas le cas.

    Ce qui est exactement la même chose que de faire une boucle for pour cela. En particulier, si tu considère que la JVM réalisera des optimisations techniques par dessus.

    D'ailleurs à ton niveau de programmation, il est plus important d'avoir un code propre / clair / simple plutôt que de gagner quelques cycle CPU, en perdant en clarté ou en lisibilité. De nos jours, les cas où le "hack" technique est favorisé est de plus en plus remis en cause. Car, cela pose beaucoup plus de problème au final.

    Sa parler que la conception de programme avec des variables globales à tendance à mener à des problèmes. Que cela soit au niveau de la responsabilité de qui doit ou ne doit pas la modifié ou de la cohérence. (Est-elle dans un état stable ? Particulièrement pour les tableaux...)

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

Discussions similaires

  1. Boucles for imbriquées
    Par The eye dans le forum ASP
    Réponses: 2
    Dernier message: 19/07/2007, 12h00
  2. Boucle for imbriqué
    Par boula dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 18/07/2007, 12h42
  3. 2 boucles for imbriquées
    Par karimphp dans le forum Langage
    Réponses: 8
    Dernier message: 02/12/2006, 14h46
  4. Batch - Deux boucle For imbriquées plus un FC
    Par Lorponos dans le forum Windows
    Réponses: 17
    Dernier message: 27/07/2006, 14h58
  5. [Syntaxe] Boucle For imbriquées en 1.5
    Par Piolet dans le forum Langage
    Réponses: 5
    Dernier message: 09/01/2005, 00h49

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