**Programme 1**
Compléter la fonction `puissance`.
* La fonction prend en paramètres $a$ et $n$ avec $a$ et $n$ deux entiers positifs supérieurs ou égaux à zéro et renvoie $a^n$.
* La fonction doit être une fonction récursive.
* Indiquer dans le code, à l'aide de commentaires, la partie qui correspond à la condition d'arrêt et la partie qui correspond aux appels récursifs.
**Programme 2**
Compléter le code ci-dessous (dix `...` à compléter).
Rappels: le 'slicing'
```
Soit L une liste
L[1:] # sélection de tous les éléments sauf le premier (= suppression du premier élément)
L[:2] # sélection des 2 premiers éléments
L[-1] # sélection du dernier élément
L[-3] # sélection du 3ème élément en partant de la fin
L[-3:] # sélection des 3 derniers éléments
L[1:3] # sélection de tous les éléments entre le 2ème (inclus) et le 4ème (exclu)
```
CODE ÉLÈVE
def puissance(a, n):
CODE ENSEIGNANT
# Jeu de tests
assert puissance(10, 3) == 1000
assert puissance(2, 3) == 8
assert puissance(5, 0) == 1
assert puissance(0, 0) == 1
print(puissance(10, 3))
print(puissance(2, 3))
print(puissance(5, 0))
print(puissance(0, 0))
SOLUTION POSSIBLE
def puissance(a, n):
# Condition d'arrêt (cas a^0 = 1)
if n == 0:
return 1
# Appels récursifs
else:
return a * puissance(a, n - 1)
# Jeu de tests
assert puissance(10, 3) == 1000
assert puissance(2, 3) == 8
assert puissance(5, 0) == 1
assert puissance(0, 0) == 1
CODE ÉLÈVE
def fusion(L1, L2):
if L1 == [] or L2 == []:
return ...
if L1[0] <= L2[0]:
return ... + fusion(L1[1:], L2)
return [L2[0]] + ...
def tri_fusion(liste):
if len(liste) <= 1:
return ...
milieu = ...
demi_liste1 = liste[...]
demi_liste2 = liste[...]
demi_liste1_triee = ...
demi_liste2_triee = ...
return ...(demi_liste1_triee, demi_liste2_triee)
CODE ENSEIGNANT
# Tests fonction tri_fusion
assert(tri_fusion([7]) == [7]), "Test 1 non réussi"
assert(tri_fusion([]) == []), "Test 2 non réussi"
assert(tri_fusion([9, 7, 5, -4]) == [-4, 5, 7, 9]), "Test 3 non réussi"
assert(tri_fusion([9, 2, 14, -4]) == [-4, 2, 9, 14]), "Test 4 non réussi"
assert(tri_fusion([4, 7, 14, 20]) == [4, 7, 14, 20]), "Test 5 non réussi"
print(tri_fusion([5, 8, 12, 1])) # [1, 5, 8, 12]
SOLUTION POSSIBLE
def fusion(L1, L2):
if L1 == [] or L2 == []:
return L1 + L2
if L1[0] <= L2[0]:
return [L1[0]] + fusion(L1[1:], L2)
return [L2[0]] + fusion(L1, L2[1:])
def tri_fusion(liste):
if len(liste) <= 1:
return liste
milieu = len(liste) // 2
demi_liste1 = liste[:milieu]
demi_liste2 = liste[milieu:]
demi_liste1_triee = tri_fusion(demi_liste1)
demi_liste2_triee = tri_fusion(demi_liste2)
return fusion(demi_liste1_triee, demi_liste2_triee)