Feuille d’exercices 2#

Objectifs

  • Listes

  • Boucles

  • Compléments sur les fonctions

Exercice 1 : manipulation élémentaire de liste#

Question 1 : Effectuer successivement les étapes suivantes :

  1. Affecter à une variable nommée L une liste vide.

  2. Ajouter l’entier \(3\) à la fin de la liste L.

  3. Insérer l’entier \(-2\) au début de la liste L.

  4. Afficher la liste L.

  5. Si le second élément de la liste L est strictement positif, alors afficher « Positif ».

# Votre réponse ici

Question 2 : Créer une liste jours contenant les noms des \(7\) jours de la semaine (chacun exprimé sous la forme d’une chaîne de caractères).

# Votre réponse ici

Question 3 : En utilisant la liste jours, afficher le troisième jour de la semaine.

# Votre réponse ici

Rappelons que pour connaître la longueur d’une chaîne de caractère, on utilise la fonction len. Par exemple, len("bonjour") vaut \(7\).

Question 4 : En parcourant la liste jours avec une boucle for, et en effectuant un test à chaque tour de boucle, afficher les jours de la semaine qui sont formés de \(5\) lettres exactement.

# Votre réponse ici

Exercice 2 : boucle for et itérateur range#

Question 1 : À l’aide d’une boucle for et du mot-clef range, afficher successivement les nombres entiers allant de \(-3\) à \(8\) (inclus).

# Votre réponse ici

Question 2 : À l’aide d’une boucle for et du mot-clef range, afficher, dans l’ordre décroissant, l’ensemble des nombres divisibles par \(5\) qui sont compris entre \(400\) et \(500\) (bornes incluses).

# Votre réponse ici

Question 3 : À l’aide d’une boucle for et du mot-clef range, calculer la somme des entiers naturels naturels impairs inférieurs à \(200\).

# Votre réponse ici

Question 4 (plus difficile) : À l’aide d’une boucle for, du mot-clef range et l’opérateur * qui permet de copier plusieurs fois le même caractère, reproduire la figure suivante, mais avec un triangle de taille 20x20 :

**********
*********
********
*******
******
*****
****
***
**
*
# Votre réponse ici

Exercice 3 : boucle while#

Question 1 : À l’aide d’une boucle while (donc, sans boucle for ni mot-clef range), afficher les entiers pairs compris entre \(16\) (inclus) et \(26\) (exclus).

# Votre réponse ici

Question 2 : À l’aide d’une boucle while, afficher les puissances de \(2\) inférieures à \(1.000.000\) (en partant de \(2^0 = 1\)).

# Votre réponse ici

Question 3 : Dans la cellule suivante, une fonction ma_fonction est écrite pour calculer le maximum d’une liste L. Décommentez la dernière ligne, exécutez la cellule, puis observez ce qui est affiché. Essayez ensuite de corriger l’erreur pour obtenir le bon résultat.

def ma_fonction(L):
    m = 0
    i = 0
    n = len(L)
    while i <= n:
        if L[i] > m:
            m = L[i]
        i += 1
    return m

# ma_fonction([13, 12, 42, -37])
# Votre réponse ici

Exercice 4 : fonction factorielle#

Rappelons qu’une fonction est dite récursive si elle s’appelle elle-même, et itérative sinon.

Question 1 : Écrire une fonction itérative factorielle(n) qui calcule la factorielle d’un entier n passé en paramètre. Tester ensuite la fonction avec les valeurs de \(n \in \{ 0, 1, 5, 10 \}\) pour lesquelles on a \(0! = 1\), \(1! = 1\), \(5! = 120\) et \(10! = 3628800\).

Ensuite, que vaut \(100!\) ?

# Votre réponse ici

Question 2 : Écrire une version récursive de la fonction factorielle, qui sera nommée factorielle_rec(n). Tester ensuite la fonction avec les mêmes valeurs que précédemment.

# Votre réponse ici

Exercice 5 : suite récurrente d’ordre 1#

On considère la suite récurrente d’ordre \(1\) définie par

\[ u_0 = 1 \quad \text{ et } \quad u_{n+1} = \left\lfloor \frac{u_n^2}{3} \right\rfloor + n, \; \forall n \ge 0\,. \]

Question 1. Écrire une fonction itérative calcule_u_iter(n) qui calcule la valeur de \(u_n\) par une fonction itérative (c’est-à-dire, sans que la fonction s’appelle elle-même).

On vérifiera notamment que \(u_2 = 1\), \(u_4 = 4\) et \(u_{10} = 96177957631162369\).

# Votre réponse ici

Question 2. Écrire une fonction récursive calcule_u_rec(n) qui calcule la valeur de \(u_n\) par une fonction récursive.

# Votre réponse ici

Exercice 6 : test de croissance de liste#

Question 1 : Écrire une fonction itérative est_croissante_iter(L), qui prend en entrée une liste L, et qui teste si cette liste est triée dans l’ordre croissant.

# Votre réponse ici

Observons maintenant qu’une liste L de longueur \(n\) est triée dans l’ordre croissant si les deux propriétés suivantes sont vérifiées :

  • ses deux derniers éléments sont triés dans l’ordre croissant

  • la sous-liste de ses \(n-1\) premiers éléments est également triée dans l’ordre croissant.

Par ailleurs, une liste de longueur \(1\) est toujours triée dans l’ordre croissant. On obtient donc une manière récursive de vérifier si une liste est triée dans l’ordre croissant.

Question 2 : En utilisant la caractérisation donnée plus haut, écrire une fonction récursive est_croissante_rec(L), qui prend en entrée une liste L, et qui teste si cette liste est triée dans l’ordre croissant. Votre fonction devra être récursive.

# Votre réponse ici