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