{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "

Complément sur la récursivité

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

1. Récursivité multiple

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Activité

\n", "

La suite de Fibonnacci est une suite de nombres dont chacun est la somme des deux précédents.
Le premier et le second nombres sont égaux à 1.
On obtient la suite de nombres : 1 - 1 - 2 - 3 - 5 - 8 - 13 - 21 - ...

\n", "\n", "

Mathématiquement, cette suite notée (Fn) est donc définie par :

\n", "\n", "
Question 1 :

Ecrivez une fonction récursive fibo(n) qui renvoie le terme de rang n de cette suite. Attention : il y a deux cas de base.

" ] }, { "cell_type": "code", "execution_count": null, "id": "1b47b2c4", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

On parle ici de récursivité multiple puisque chaque appel entraîne plusieurs appels récursifs (deux !).

\n", "
Question 2 :
sur feuille , écrire l'exécution de l'appel de fibo(4) en utilisant la présentation donnée dans le cours.
Soyez rigoureux car chaque appel récursif génère deux appels récursifs." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Exercice 11
Complèter le code de la fonction récursive qui recherche le minimum d'une tableau T en appliquant le principe de la dichotomie \n", " \n" ] }, { "cell_type": "code", "execution_count": 1, "id": "3d8cd70e", "metadata": {}, "outputs": [], "source": [ "def rech_min_rec(T):\n", " il len(T)==...:\n", " return ....\n", " else:\n", " a= .....\n", " b= .....\n", " if a>b:\n", " return b\n", " else:\n", " return a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

2. Récursivité terminale

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Un algorithme récursif simple est terminal lorsque l’appel récursif est le dernier calcul effectué pour obtenir le résultat.
Il n’y a pas de \"calcul en attente\". L’avantage est qu’il n’y a rien à mémoriser dans la pile.

\n", "\n", "

Pour rendre terminal un algorithme récursif, on utilise un accumulateur placé en paramètre.
\n", "Voici la fonction factorielle en récursivité terminale :

" ] }, { "cell_type": "code", "execution_count": 2, "id": "faaf421d", "metadata": {}, "outputs": [], "source": [ "def fact_term(n, acc = 1):\n", " if n <= 1:\n", " return acc\n", " else:\n", " return fact_term(n-1, acc * n)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Une autre définition possible de fonction f récursive terminale est quand tout appel récursif est de la forme return f(...); sans qu'il n'y ait aucune opération sur cette valeur.

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Exercice 13
\n", "soit la fonction occ(c,s) qui compte le nombre d'occurences du caractère c dans le mot mot" ] }, { "cell_type": "code", "execution_count": 1, "id": "f1f9e5da", "metadata": {}, "outputs": [], "source": [ "def occ(c,mot):\n", " if len(mot) == 0:\n", " return 0\n", " elif c == mot[0]:\n", " return 1 + occ(c,mot[1:])\n", " else:\n", " return occ(c,mot[1:])\n", "\n", "assert occ(\"e\",\"combien de e dans cette phrase ?\")==6\n", "assert occ(\"e\",\"la disparition\")==0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Ecrire occt une fonction version récursif terminal de la fonction occ

" ] }, { "cell_type": "code", "execution_count": null, "id": "5db2890e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "29469f30", "metadata": {}, "source": [ "
Exercice 14
\n", "Ecrire la fonction de Fibonnacci en récursivité terminale puis comparer la rapidité d'execution avec la recursivité classique." ] }, { "cell_type": "code", "execution_count": 2, "id": "e25bb785", "metadata": {}, "outputs": [], "source": [ "def fibo2():\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

3. Récursivité croisée

\n", "

On parle de récursivité croisée lorsque deux fonctions s’appellent l’une l’autre récursivement.

\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "614101d0", "metadata": {}, "outputs": [], "source": [ "# Exemple typique (et très classique) :\n", "def pair(n):\n", " if n == 0:\n", " return True\n", " else:\n", " return impair(n-1)\n", "\n", "def impair(n):\n", " if n == 0:\n", " return False\n", " else:\n", " return pair(n-1)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Détailler sur feuille l'appel de fonction : pair(7)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.13" } }, "nbformat": 4, "nbformat_minor": 5 }