Partage
  • Partager sur Facebook
  • Partager sur Twitter

Boucle for sans itération

Sujet résolu
    15 novembre 2014 à 21:09:42

    Bonsoir,
    Voilà le bout de code en question

    for i in range(0,tab[0]):
                    for j in range(0,tab[1]):
                        for k in range(0,tab[2]):
                            for l in range(0,tab[3]):
                                for m in range(0,tab[4]):
                                    for n in range(0,tab[5]):
                                        if ((tab[0]*2+tab[1]+tab[2]*0.5+tab[3]*0.2+tab[4]*0.1+tab[5]*0.05) - (tab[i]*2+tab[j]+tab[k]*0.5+tab[l]*0.2+tab[m]*0.1+tab[n]*0.05)) == 2:
                                            print(tab[0]*2+tab[1]+tab[2]*0.5+tab[3]*0.2+tab[4]*0.1+tab[5]*0.05)
                                            print(tab[i]*2+tab[j]+tab[k]*0.5+tab[l]*0.2+tab[m]*0.1+tab[n]*0.05)
                                            trouve=True
                                            break;
                                    if (trouve==True):
                                        break;
                                if (trouve==True):
                                    break;
                            if (trouve==True):
                                break;
                        if (trouve==True):
                            break;
                    if (trouve==True):
                        break;
    Le tableau contient 6 int me donnant le nombre de pieces utilisées, respectivement 2 euros 1 euro 50 centimes 20 centimes 10 centimes et 5 centimes, sauf que si jamais je met 0 piece de 1 euro par exemple il ne rentre pas dans la boucle for associée
    De ce fait je me demandais si il était possible de rentrer dans une boucle for sans pour autant y faire d'itération.
    Et j'en profite pour demander aussi: on m'a dit qu'il existait un nombre limite d'appels récursifs possible sur une fonction. Est ce vrai ? Si oui, a combien sommes nous limité ?
    Merci d'avance
    Cordialement
    • Partager sur Facebook
    • Partager sur Twitter
      15 novembre 2014 à 21:29:02

      Oh mon dieu, j'ai rarement vu un code aussi dégueulasse o_O Enfin c'est pas vraiment dégueulasse au sens illisible, mais plutôt au sens d'extrêmement mal optimisé et mal conçu, pour aboutir à autant de niveaux d'indentation.

      Essaie de réfléchir autrement à comment tu pourrais faire, et si tu ne trouve pas cherche un peu c'est un exercice très courant et il y a donc déjà des sujets là-dessus sur le forum (le dernier est assez récent d'ailleurs). Je ne vois pas trop le sens de ta question, ça ne sert à rien de rentrer dans une boucle for sans faire d'itérations, puisque c'est justement le principe de la boucle for.

      Ensuite oui il y a bien une limite pour les récursions maximales, elle est de 995 (enfin c'est celle de la factorielle récursive, sur mon pc, mais j'imagine que ça doit être a peu près la même chose pour tout le monde).

      PS: ne prend pas mal ce que j'ai dit, j'imagine que tu as du passer pas mal de temps sur ce programme, mais en l'état ce n'était pas possible de ne pas faire de remarque sur le code ;) (qui qui plus est ne marche pas totalement, alors ce n'est pas si grave :p)

      Cordialement, 

      Derzal

      • Partager sur Facebook
      • Partager sur Twitter
        15 novembre 2014 à 21:35:13

        Oui je sais que c'est dégueulasse, je suis 100% d'accord la dessus,
        Mais j'ai pas envie de passer par du récursif à cause de cette "limite", ni par les piles ou autre objet si toute fois c'est possible.

        Du coup ma question revient à, est ce qu'il y a un moyen de contourner le problème sans passer par du récursif, piles, et compagnies?
        • Partager sur Facebook
        • Partager sur Twitter
          15 novembre 2014 à 22:15:16

          Oui tu décompose ton chiffre en sous unités, je ne vois même pas comment tu as eu l'idée de faire ça (le code ci-dessus). Je te donne le lien du sujet récent dont je parlais, essaie de voir ce que tu peux faire avec ça (c'est exactement le même exercice je pense). Bien sur ce n'est pas le premier message qu'il faut regarder, mais les suivants ;)

          Edit: et encore tous les messages suivants ne sont pas bons, mais bon il faut essayer de voir la logique de décomposition

          -
          Edité par Derzal 15 novembre 2014 à 22:16:47

          • Partager sur Facebook
          • Partager sur Twitter
            15 novembre 2014 à 22:29:52

            Je souhaitais parcourir toutes les solutions possibles donc la premières choses qui m'est venue ce sont les boucles for.
            Ensuite je comprends pas très bien ce que entends par décomposition en sous unités
            Et j'ai pas précisé et c'est peut être pour ça que ma démarche te semble étrange mais je dois faire en sorte que si on me donne pour plus de 2 euros je dois: rendre l'excédent pour atteindre 2 euros et ce, uniquement avec les pièces données par l'utilisateur, ou si c'est impossible tout rendre.
            • Partager sur Facebook
            • Partager sur Twitter
              15 novembre 2014 à 22:37:39

              Attend on parle bien du même problème? Tu as une somme d'argent (à rendre, mais peu importe), et tu dois rendre le moins de pièces possibles (optimiser le rendu de monnaie quoi). Donc tu vas chercher à voir combien de pièces de 2 euros tu peux mettre dans cette somme, puis tu va soustraire 2€ * le nb de pièces à cette somme, et continuer ainsi de suite avec les pièces de plus en plus faibles jusqu'à ce que la somme à rendre soit 0. C'est bien ça? (ça serait con que je me sois trompé de programme ^^)
              • Partager sur Facebook
              • Partager sur Twitter
                15 novembre 2014 à 22:40:33

                Non justement, l'utilisateur mets des pieces, et je dois rendre, parmis les pieces qu'il me donne, pour qu'il me reste 2euros tout pile.
                • Partager sur Facebook
                • Partager sur Twitter
                  15 novembre 2014 à 22:44:36

                  Et si tu nous donnais exactement le problème qui t'est demandé? :) On gagnerait un peu de temps.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 novembre 2014 à 22:45:33

                    D'aaaccord :) Bon du coup je suis totalement à coté de la plaque, excuse moi :s

                    Tu dois trouver toutes les solutions possibles ou une seule suffit?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 novembre 2014 à 22:48:18

                      J'ai pas l'énoncé sous la main.
                      C'est l'exercice de la machine a café, on dispose d'une machine à café qu'on créer puis configurer, l'utilisateur fait sa commande et insere ses pièces, on récupère les pièces insérées:
                      Si la somme des pieces insérées est superieur a 2 euros :

                            Soit on rend, parmis les pieces données, pour qu'il ne reste que 2 euros.
                            Soit on rend tout et on recommence la commande

                      Le reste est pas important, sachant que je cherche de l'aide et non pas la réponse hein ;) 

                      -
                      Edité par ZOoMaaaaa 15 novembre 2014 à 22:49:15

                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 novembre 2014 à 22:49:43

                        Tu ne répond pas à la question: toutes les possibilités ou une seule suffit (quoique le programme serait sensiblement le même dans les deux cas)

                        Edit: d'accord merci c'est plus clair, je vais voir ce que je peux faire (mais ce ne seras sans doute pas ce soir, je vais aller dodo)

                        -
                        Edité par Derzal 15 novembre 2014 à 22:50:39

                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 novembre 2014 à 22:52:29

                          Pas de problèmes, merci pour ton aide
                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 novembre 2014 à 23:05:15

                            Donc en gros, tu peux faire l'addition des pièces pour savoir combien tu as reçu. Si c'est moins que 2€, tu rends le tout. Si c'est 2€ t'es tout content et tu ne rend rien. Si c'est plus, ben tu soustrais 2€ de ce total, et c'est la valeur à rendre. Là commence le problème. Tu vas essayer de garder 2€ en partant des plus grosses pièces (2€ - 1€ - 50 cents - ...). Une fois que tu as enlevé ce dont tu as besoin, tu peux rendre ce qu'il te reste.

                            Tu as dis que tu avais un tableau tab contenant des int avec le nombre de pièces données. Tu pourrais avoir un deuxième tableau contenant la valeur de chaque pièce individuelle [2, 1, 0.5, 0.20, 0.10, 0.05]. Tu peux combiner les valeurs une à une avec la fonction zip

                            tab = [2, 1, 3, 4, 0, 2]
                            values = [2, 1, 0.5, 0.2, 0.1, 0.05]
                            

                            totals = [x*y for x, y in zip(tab, values)] total = sum(totals) print(totals) print(total)

                            </pre>

                            -
                            Edité par Dan737 15 novembre 2014 à 23:05:50

                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 novembre 2014 à 23:10:27

                              Le probleme de la méthode que tu énonces c'est que si je choisi de commencer par une piece et donc d'utiliser "%" pour avoir le reste, il y a pleins de solutions qui passent a la trappe

                              Récupérer le total est pas une problème, bien que ta solution soit extrêmement plus simple.
                              C'est le parcours exhaustif des solutions qui me pose problème 

                              • Partager sur Facebook
                              • Partager sur Twitter
                                15 novembre 2014 à 23:13:21

                                Dixit le mec qui vient de dire qu'une seule solution suffisait...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 novembre 2014 à 23:18:06

                                  J'entend par là que si on fait comme il propose on passe à la trappe plein de solutions POTENTIELLES: c'est à dire qu'on peut ne pas trouver de solution avec sa méthode alors qu'il en existe une.
                                  Je te sens tatillon Derzal =P
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    15 novembre 2014 à 23:23:14

                                    Non, sa méthode est belle est bien correcte, tu trouveras forcément une solution.

                                    Je suis peut-être tatillon, mais tes messages sont ambigus ;)

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      15 novembre 2014 à 23:29:03

                                      J'ai pas d'exemple en tête mais on a pu voir en cours qu'on explore pas toutes les possibilités et qu'on peut ne pas trouver de solution avec cette méthode alors qu'il en existe une.
                                      Je cherche le contre exemple
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        15 novembre 2014 à 23:42:28

                                        Dan n'a pas parlé de modulo (retirer ici veut dire soustraire). Si j'ai bien compris sa méthode (qui me semble bonne), c'est qu'en premier: tu fais la somme pour voir si t'a plus de 2€. Si t'as moins: pas besoin de faire un quelconque calcul, tu rends immédiatement la monnaie. Et si t'as pile le bon compte: pas besoin de faire un calcul également car c'est ce que tu souhaite (mais 2€ le café ça fait un peu cher tout de même :)).

                                        Donc faire la somme AVANT toute opération est une très bonne idée. Il ne reste qu'un cas (et c'est celui qui va engendrer un peu de travail): quand on te donne plus de 2€.

                                        Maintenant je comprends ce que tu veux dire ZooMa: si tu as par exemple: 1€ + 0.50€ + 3*0.2€ + 5*0.1€ + 2*0.05€, tu veux que la machine rende l'intégralité du surplus. En utilisant la technique de Dan, arrivé au 0.20€ tu as peur qu'elle garde les 3 pièces (et donc garde un surplus de 10cents) et rende le reste. Mais Dan n'a pas dit que tu n'avait pas le droit d'ajouter (et c'est fortement conseillé) une condition de vérification à chaque pièce prise pour savoir si ça dépasse les 2 euros. Si c'est le cas, tu laisse de côté la pièce et tu passe à la catégorie suivante.

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Précepte: Le mieux est l'ennemi du bien
                                          15 novembre 2014 à 23:46:05

                                          VOici un contre exemple
                                          1 Piece de 2 euros
                                          1 Piece de 1 euro
                                          1 Piece de 50 centimes
                                          4 Pieces de 20 centimes

                                          Si on suit ta méthode, on a 2 euros et 10 centimes à rendre.
                                          Donc on prend la piece de 2euros puis on se retrouve bloqué parce qu'on a pas de pièce de 10 centimes
                                          Alors qu'il existe bien une solution, rendre toute les pieces sauf celle de 2 euros 

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            15 novembre 2014 à 23:47:58

                                            Bah nan. Tu as une pièce de 2 euros, donc tout le reste est à rendre?
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Précepte: Le mieux est l'ennemi du bien
                                              15 novembre 2014 à 23:53:27

                                              Alors j'avais pas compris sa méthode dans ce sens là et j'avais mal compris mais dans ce sens là:
                                              Si on a :
                                              3 Pieces de 50 centimes
                                              6 Pieces de 20 centimes

                                              On va garder 3 pieces de 50 centimes et on va se retrouver bloqué 

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                15 novembre 2014 à 23:55:36

                                                Mais je vois ce que tu veux dire: Si par exemple on a: 0.50€ + 10*0.20€, si on prend la première pièce, on va se retrouver bloquer. C'est sûr que c'est plus complexe dans ce cas
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Précepte: Le mieux est l'ennemi du bien
                                                  15 novembre 2014 à 23:57:12

                                                  Oui voilà, parce que de tête je peux le faire, mais d'un point de vue algorithmique je bloque.
                                                  On en revient à ma première méthode qui marche mais seulement si l'utilisateur utilise au moins une pièce de chaque
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    16 novembre 2014 à 0:03:10

                                                    Et si on se contentait de ne regarder que le reste (que ce qu'on doit rendre): 3*0.50€ + 6*0.2€ = 2.7€. Le reste est donc de 0.7€ et là on applique la méthode de Dan.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Précepte: Le mieux est l'ennemi du bien
                                                      16 novembre 2014 à 0:05:28

                                                      ZOoMaaaaa a écrit:

                                                      VOici un contre exemple
                                                      1 Piece de 2 euros
                                                      1 Piece de 1 euro
                                                      1 Piece de 50 centimes
                                                      4 Pieces de 20 centimes

                                                      Si on suit ta méthode, on a 2 euros et 10 centimes à rendre.
                                                      Donc on prend la piece de 2euros puis on se retrouve bloqué parce qu'on a pas de pièce de 10 centimes
                                                      Alors qu'il existe bien une solution, rendre toute les pieces sauf celle de 2 euros 


                                                      C'est ce que je pensais que Dan voulait faire, du coup j'ai déjà donné un contre exemple
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        16 novembre 2014 à 0:08:21

                                                        Oui mais dans cet exemple, il y a une pièce de 2€. Donc le calcul s'arrête direct. Aussi, si tu dois faire des conditionnelles (des if, elif, else), ça sera cette vérification qu'il faudra faire en premier
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Précepte: Le mieux est l'ennemi du bien
                                                          16 novembre 2014 à 0:12:28

                                                          J'essaierai ça demain.
                                                          MAis y a rien qui m'assure qu'on teste bien toutes les possibilités. 
                                                          Si ?

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            16 novembre 2014 à 0:17:57

                                                            Je sais pas. Mais je pense qu'on est sur la bonne voie :).

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Précepte: Le mieux est l'ennemi du bien

                                                            Boucle for sans itération

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown