DS0010 - Corrigé⚓︎
Exercice 1⚓︎
-
Une fonction récursive est une fonction qui s'appelle elle-même dans sa définition. Elle comporte :
- un (ou plusieurs) cas d'arrêt;
- un appel récursif avec un paramètre croissant ou déroissant qui amènera au cas d'arrêt.
-
Un algorithme glouton effectue à chaque étape le meilleur choix local, en espérant que la soluton (rapide à obtenir) soit assez proche de la meileure solution globale.
Exercice 2⚓︎
1 2 3 4 | |
Exercice 3⚓︎
-
Premier passage: 4-9-8-7-4-2 (du haut vers le bas) puis 4-8-7-4-2 puis 4-8-4-2
Deuxième passage: 4-4-2
Troisième passage: 4-2 (la pile est gagnante)
-
La pile gagnante est la pile B.
-
1 2 3 4 5 6 7 8 9
def sommet(p:Pile) -> int: ''' Fonction qui renvoie l'élément au sommet de la pile p sans le retirer. ''' if not p.est_vide(): s = p.depiler() p.empiler(s) return s -
1 2 3 4 5 6 7 8 9 10 11
def taille(p): c = 0 q = Pile() while not p.est_vide(): c += 1 elt = p.depiler() q.empiler(elt) while not q.est_vide(): elt = q.depiler() p.empiler(elt) return c -
1 2 3 4 5 6 7
def reduire_triplet_au_sommet(p): a = p.depiler() b = p.depiler() c = sommet(p) if a % 2 != c % 2 : #le premier (a) et le troisième (c) ne sont pas de même parité p.empiler(b) # on ne supprime pas b donc on l'empile p.empiler(a) # dans tous les cas on empile a -
a. Il faut au minimum 3 éléments pour pouvoir simplifier et qu'il n'en reste que deux.
b.
1 2 3 4 5 6 7 8 9
def parcourir_pile_en_reduisant(p): q = Pile() while taille(p) >= 3: reduire_triplet_au_sommet(p) elt = p.depiler() q.empiler(elt) while not est_vide(q): elt = q.depiler() p.empiler(elt)c.
1 2 3 4 5 6 7 8
def jouer(p): t1 = taille(p) parcourir_pile_en_reduisant(p) t2 = taille(p) if t1 == t2 : # si après réduction la taille est la même, c'est terminé return p # on renvoie la pile else: return jouer(p) # sinon on recommence avec p qui a été réduite
Exercice 4⚓︎
-
1 2 3 4
class Carte: def __init__(self, v): self.valeur = v self.TdB = self.calcul_Tdb() -
1 2 3 4 5 6 7 8 9 10 11
def calcul_TdB(self): tetes = 0 if self.valeur % 11 == 0: tetes += 5 if self.valeur % 10 == 0: # la valeur se termine par un 0 tetes += 3 if self.valeur % 10 == 5: # la valeur se termine par un 5 tetes += 2 if tetes == 0: tetes = 1 return tetes -
1 2 3 4 5 6 7 8 9 10
class Main: def __init__(self, liste_cartes): self.contenu = liste_cartes def afficher(self): for carte in self.contenu: print(carte.valeur) def ajouter_carte(self, carte): self.contenu.append(carte) -
1 2 3 4 5
def nombre_TdB(self): total = 0 for carte in self.contenu: total += carte.TdB return total -
1 2 3 4 5
class Jeu: def __init__(self, n): self.nbr = n self.paquet = [Carte(k) for k in range(1, 105)] self.mains = [] -
Il faut écrire
from random import shuffle -
1 2 3 4 5 6 7
def distribuer(self): self.melanger() self.mains = [Main([]) for _ in range(self.nbr)] for i in range(10): for joueur in range(self.nbr): carte = self.paquet.pop() self.mains[joueur].ajouter_carte(carte) -
1 2 3 4 5 6 7 8 9 10
manche_1 = Jeu(4) # pour 4 joueurs par exemple manche_1.distribuer() indice_main_max = 0 main_max = 0 for i in range(len(manche_1.mains)): if manche_1.mains[i].nombre_TdB() >= main_max: main_max = manche_1.mains[i].nombre_TdB() indice_main_max = i print(f"La main d'indice {i} est celle contenant le plus de têtes de bœuf")