1. Livres & vidéos
  2. Algorithmique
  3. Énoncé 7 : Récursivité
Extrait - Algorithmique Entraînez-vous et améliorez votre pratique de la programmation (exemples en Java et Python) (2e édition)
Extraits du livre
Algorithmique Entraînez-vous et améliorez votre pratique de la programmation (exemples en Java et Python) (2e édition) Revenir à la page d'achat du livre

Énoncé 7 : Récursivité

Introduction

Durée

3 heures

Mots-clés

récursivité, condition d’arrêt, récursivité croisée

Objectif

Dans ce chapitre, vous apprendrez à :

  • écrire des méthodes récursives  ;

  • déterminer les conditions d’arrêt de la récursivité  ;

  • mettre en œuvre la récursivité croisée.

Prérequis

Pour valider les prérequis nécessaires avant d’aborder le TP, répondez aux questions ci-après.

1.

Qu’est-ce qu’une méthode (ou une fonction) récursive ?

2.

À quoi sert la condition d’arrêt d’une méthode récursive ?

3.

Qu’est-ce que la récursivité croisée ?

Énoncé 7.1 : La factorielle (écriture récursive)

Durée estimative : 15 minutes

La factorielle de n est notée n!. Elle est définie mathématiquement ainsi :

0! = 1 
Si n > 0, n! = n * (n-1)! 

Écrivez en Java/Python la fonction fact qui prend comme paramètre n et qui renvoie la factorielle de n. La fonction fact doit être écrite sous la forme d’une fonction récursive.

Écrivez ensuite le programme principal qui lit au clavier la valeur de n puis en affiche la factorielle. 

Énoncé 7.2 : Le PGCD (écriture récursive)

Durée estimative : 20 minutes

Reprenez l’énoncé de l’exercice 1.13 et écrivez en Java/Python la fonction pgcd qui renvoie la valeur du PGCD de deux nombres entiers positifs non nuls. La fonction pgcd doit être écrite sous la forme d’une fonction récursive.

Écrivez ensuite le programme principal qui lit au clavier la valeur de deux nombres entiers positifs non nuls puis en affiche le PGCD. Il n’est pas nécessaire de vérifier que les deux nombres entiers soient bien positifs et non nuls.

Énoncé 7.3 : L’additionneur/multiplicateur

Durée estimative : 25 minutes

Le but de l’exercice est d’écrire la fonction addMult (Java)/add_mult (Python) qui calcule la somme ou le produit de plusieurs entiers lus au clavier. L’utilisateur saisit d’abord les entiers un à un jusqu’à ce qu’il saisisse le caractère + pour demander l’addition ou * pour demander la multiplication. Par ailleurs, le nombre d’entiers n’est pas connu à l’avance et il ne faut pas considérer de maximum pour ce nombre. Enfin, il ne faut pas réaliser de calculs inutiles, à savoir calculer l’addition alors que finalement l’utilisateur demande la multiplication ou le contraire.

La fonction renvoie le total ou le produit de tous les nombres saisis. Écrivez la fonction sous la forme d’une fonction récursive.

Écrivez ensuite le programme principal qui appelle la fonction addMult (Java)/add_mult (Python) puis affiche le résultat renvoyé par celle-ci.

Indices

Il convient de lire chaque entrée de l’utilisateur dans une chaîne de caractères.

Dans la version Java, si cette entrée n’est pas un caractère + ou *, vous pouvez utiliser la méthode parseint() de la classe String pour convertir une chaîne de caractères en un entier. Dans la version Python...

Énoncé 7.4  : Le tri par sélection (écriture récursive)

Durée estimative : 30 minutes

Reprenez l’énoncé de l’exercice 2.10 qui décrit un programme effectuant le tri par sélection d’un tableau.

Écrivez maintenant la procédure triSelection (Java)/tri_selection (Python) qui prend deux paramètres :

  • un tableau d’entiers à trier ;

  • la prochaine position qu’il faut échanger avec la plus petite valeur présente dans le tableau à partir de cette position.

Cette procédure de tri est une méthode récursive.

Écrivez ensuite en Java/Python le programme principal qui crée un tableau de 20 valeurs. La valeur initiale du tableau est fournie par des valeurs aléatoires comprises entre 0 et 100. Le programme appelle ensuite la procédure de tri. Enfin, il affiche toutes les valeurs du résultat.

Indice

Chaque appel récursif a pour objet le tri du tableau à la position suivante. La condition d’arrêt de la récursivité est donc un test sur la position.

Énoncé 7.5 : La classe Expression

Durée estimative : 45 minutes

Dans un premier temps, vous devez étudier soigneusement la classe Expression décrite à la suite en Java/Python. La méthode evalue de la classe Expression permet d’évaluer des expressions que l’utilisateur saisit au clavier, en tapant les nombres et opérateurs successivement en les séparant par un retour à la ligne. Cette méthode invoque la méthode add qui gère les additions et les soustractions. Pour obtenir les valeurs à additionner ou à soustraire, la méthode mult est appelée. Celle-ci gère les multiplications et les divisions. Ainsi, la priorité de ces opérateurs sur l’addition et la soustraction est respectée.

Dans un premier temps, écrivez un programme principal pour tester la méthode d’évaluation de la classe Expression.

Le code Java de cette classe se présente de la façon suivante :

import java.util.Scanner; 
public class Expression { 
    Scanner reader = new Scanner(System.in); 
    String token; 
 
    public int valeur() { 
        int resultat; 
        System.out.print("Entrez un nombre entier : "); 
        resultat = reader.nextint(); 
        return resultat; 
    } 
 
    public void lireToken() { 
        token = reader.next(); 
    } 
 
    public int mult() { 
        int opA, opB; 
        String operateur; 
         opA = valeur(); 
        System.out.print("Entrez opérateur ou '=' : ") ; 
 ...

Énoncé 7.6 : Le comptage des fichiers et des répertoires

Durée estimative : 45 minutes

Dans cet exercice, nous représentons un système hiérarchique de fichiers et proposons de l’étendre pour prendre en compte une fonctionnalité de comptage.

En Java, le système hiérarchique de fichiers est représenté au moyen de l’interface et des deux classes suivantes. L’interface dont le code est fourni ci-après introduit la notion de nœud qui est une abstraction de fichier et de répertoire. Chaque nœud possède une méthode pour compter le nombre de fichiers qu’il contient (y compris lui-même) et une autre méthode pour compter le nombre de répertoires qu’il contient (y compris lui-même).

public interface Noeud {  
      long nombreFichiers();  
      long nombreRepertoires(); 
} 

Si le nœud est un fichier, l’écriture de ces deux méthodes est très simple.

public class Fichier implements Noeud { 
      public long nombreFichiers() { 
            return 1; 
        } 
      public long nombreRepertoires() { 
            return 0; 
   ...