mystère est une fonction récursive.mystère(3, 5) appelle mystère(3, 2) qui appelle mystère(3, 1) qui appelle mystère(3, 0) qui renvoie 1.1%2 == 0 est faux, mystère(3, 1) renvoie 1 * 1 * 3, donc 3.2%2 == 0 est vrai, mystère(3, 2) renvoie 3 * 3, donc 9.5%2 == 0 est faux, mystère(3, 5) renvoie 9 * 9 * 3, donc 243.docstring avec doctest serait donc :def mystère(a: int, b: int) -> int: """ Renvoie `a` à la puissance `b`. >>> mystère(7, 0) 1 >>> mystère(3, 5) 243 """ ...
def mystère_force_brute(a: int, b: int) -> int: """ Renvoie `a` à la puissance `b`. >>> mystère_force_brute(7, 0) 1 >>> mystère_force_brute(3, 5) 243 """ puissance = 1 for _ in range(b): puissance = puissance * a return puissance
mystère_force_brute(3, 1000) effectue tours de boucle avec une multiplication à chaque fois.
5. mystère(a, b) fait des appels récursifs jusqu'à ce que b soit nul, en faisant une ou deux multiplications à chaque fois. Le nombre d'appels récursifs est le nombre de fois que b peut être divisé par deux avant de devenir nul ; (c'est presque le logarithme en base de deux de b) ; c'est presque le nombre de chiffres en binaire de b. Le coût est donc presque proportionnel au nombre de chiffres de b.
mystère(3, 1000), il y a multiplication, plus le calcul de mystère(3, 500) ;mystère(3, 500), il y a multiplication, plus le calcul de mystère(3, 250) ;mystère(3, 250), il y a multiplication, plus le calcul de mystère(3, 125) ;mystère(3, 125), il y a multiplications, plus le calcul de mystère(3, 62) ;mystère(3, 62), il y a multiplication, plus le calcul de mystère(3, 31) ;mystère(3, 31), il y a multiplications, plus le calcul de mystère(3, 15) ;mystère(3, 15), il y a multiplications, plus le calcul de mystère(3, 7) ;mystère(3, 7), il y a multiplications, plus le calcul de mystère(3, 3) ;mystère(3, 3), il y a multiplications, plus le calcul de mystère(3, 1) ;mystère(3, 1), il y a multiplications, plus le calcul de mystère(3, 0) ;mystère(3, 0), il y a multiplication, le résultat est renvoyé directement.tableau est une liste Python.f après tableau_valeurs. Ce qui compte c'est de la définir avant de s'en servir effectivement.f = lambda t: 10 // (t - 2)f(2) provoque une erreur de division par zéro.f(4) renvoie 10 // 2, soit .f(8) renvoie 10 // 6, soit .f(16) renvoie 10 // 14, soit .tableau_valeurs(f, -2, 4) essaie de calculer f(x) pour x de -2 inclus à 4 exclu.x qui vaut 2, dans ce cas, l'erreur de division par zéro est capturée, puis ignorée (pass).tableau prend alors les valeurs successives :
[][(-2, -3)][(-2, -3), (-1, -4)][(-2, -3), (-1, -4), (0, -5)][(-2, -3), (-1, -4), (0, -5), (1, -10)][(-2, -3), (-1, -4), (0, -5), (1, -10), (3, 10)]donne_taille et donne_liste sont des méthodes accesseurs, en anglais des getter.__ permet de rendre les attributs privés.class ListeCroissante: def __init__(self): self.__liste = [] self.__taille = 0 def donne_taille(self): return self.__taille def donne_liste(self): """ Renvoie la liste dans l'ordre croissant. """ return self.__liste def ajoute(self, x): """Ajoute l'élément x dans la liste à une place qui maintient l'ordre croissant, en décalant le reste de la liste si nécessaire. """ i = 0 while (i < self.__taille) and (__liste[i] < x): i += 1 while (i < self.__taille): y = self.__liste[i] self.__liste[i] = x x = y self.__liste.append(x) self.__taille += 1 def contient(self, x): """Renvoie True si x est dans la liste. """ for i in range(self.__taille): if self.__liste[i] == x: return True #optionnel, retour prématuré if self.__liste[i] > x: # les suivants seront encore plus grands return False return False def extrait(self, x): i = 0 while (i < self.__taille) and (__liste[i] < x): i += 1 if (i == self.__taille) or (self.__liste[i] != x): raise ValueError("x absent de la liste") while (i+1 < self.__taille): self.__liste[i] = self.__liste[i+1] self.__liste.pop() self.__taille -= 1
[], on va empiler 1,[1], on va empiler 2,[1, 2], on va empiler 3,[1, 2, 3], on va appliquer l'opération *,[1, 6], on va appliquer l'opération +,[7], on va empiler 4,[7, 4], on va appliquer l'opération *,[28], on a fini !def calcule_RPN(expression: str) -> int: pile = [] taille = 0 for argument in expression.split(" "): if argument == '+': if taille < 2: raise ValueError("mauvaise expression") entier_2 = pile.pop() entier_1 = pile.pop() pile.append(entier_1 + entier_2) taille -= 1 elif argument == '-': if taille < 2: raise ValueError("mauvaise expression") entier_2 = pile.pop() entier_1 = pile.pop() pile.append(entier_1 - entier_2) taille -= 1 elif argument == '*': if taille < 2: raise ValueError("mauvaise expression") entier_2 = pile.pop() entier_1 = pile.pop() pile.append(entier_1 * entier_2) taille -= 1 elif argument == '/': if taille < 2: raise ValueError("mauvaise expression") entier_2 = pile.pop() entier_1 = pile.pop() pile.append(entier_1 // entier_2) taille -= 1 else: # argument devrait être un entier try: un_entier = int(argument) except: raise ValueError("mauvaise expression") pile.append(un_entier) taille += 1 if taille != 1: raise ValueError("mauvaise expression") return pile[0]
True à et False à , on a :class PileBool: def __init__(self): self.pile = 1 def est_vide(self): return self.pile == 1 def empile(self, x: bool): self.pile *= 2 if x: self.pile += 1 def dépile(self): x = self.pile % 2 self.pile //= 2 return x == 1
"b"."abb" en plus de "b"."a"+"b"+"abb", "a"+"abb"+"b" et "a"+"abb"+"abb", en plus,
"ababb", "aabbb", "aabbabb"."ababb" seul en nouveau :
"a"+"ababb"+"b", soit "aababbb""a"+"ababb"+"abb", soit "aababbabb""a"+"b"+"ababb", soit "abababb""a"+"abb"+"ababb", soit "aabbababb""aabbb" seul en nouveau :
"a"+"aabbb"+"b", soit "aaabbbb""a"+"aabbb"+"abb", soit "aaabbbabb""a"+"b"+"aabbb", soit "abaabbb""a"+"abb"+"aabbb", soit "aabbaabbb""aabbabb" seul en nouveau :
"a"+"aabbabb"+"b", soit "aaabbabbb""a"+"aabbabb"+"abb", soit "aaabbabbabb""a"+"b"+"aabbabb", soit "abaabbabb""a"+"abb"+"aabbabb", soit "aabbaabbabb""ababb" et "aabbb"
"ababb" et "aabbb"
b, un de plus que de a (zéro)."a"+ mot_1 + mot_2,
a est un plus celui de mot_1 plus celui de mot_2.#mot_a = 1 + #mot_1_a + #mot_2_a#mot_b = 0 + #mot_1_b + #mot_2_b#mot_1_b = 1 + #mot_1_a, et#mot_2_b = 1 + #mot_2_a, et#mot_b = 0 + (1+#mot_1_a) + (1+#mot_2_a)#mot_b = 1 + (1 + #mot_1_a + #mot_2_a)#mot_b = 1 + #mot_a