6666 lines
453 KiB
Plaintext
6666 lines
453 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Récursivité et Programmation Dynamique\n",
|
|
"\n",
|
|
"# La reproduction des lapins\n",
|
|
"\n",
|
|
"Nous allons utiliser 2 grandes méthodes de programmation que nous allons appliquer à un problème célèbre et récurrent dans le milieu de la programmation.\n",
|
|
"\n",
|
|
"En 1202, Leonardo Fibonacci publie un ouvrage dans lequel il traite d'un problème simple et concret : la croissance d'une population de lapins. Il s'agit de savoir comment contrôler la population des clapiers et quand vendre ses lapins, etc.\n",
|
|
"\n",
|
|
"Voici le fonctionnement simplifié de cette reproduction :\n",
|
|
"\n",
|
|
"1. On compte les lapins par **couple**\n",
|
|
"2. **Chaque mois** chaque couple de lapins matures donne naissance à 1 couple de jeunes lapins immatures\n",
|
|
"3. Après 2 mois les jeunes couples devienent matures et engendrent à leur tour un jeune couple immature\n",
|
|
"4. On étudie la croissance de la population tous les mois : n est le nombre de mois\n",
|
|
"\n",
|
|
"| n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |\n",
|
|
"|:------------------------------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:--:|:--:|:--:|:--:|\n",
|
|
"| nb couples matures | 0 | 0 | 0 | 1 | | | | | | | |\n",
|
|
"| nb couples immatures 1er mois | 0 | 1 | 0 | 1 | | | | | | | |\n",
|
|
"| nb couples immatures 2ème mois | 0 | 0 | 1 | 0 | | | | | | | |\n",
|
|
"| nb couples | 0 | 1 | 1 | 2 | | | | | | | |\n",
|
|
"\n",
|
|
"- Complétez les mois manquants en respectant les règles de reproduction.\n",
|
|
"\n",
|
|
"- En vous inspirant de la méthode que vous avez employée pour compléter le tableau ci-dessus, écrivez une fonction `lapinoux(n)` qui retourne le nombre de couples de lapin obtenus au mois n.\n",
|
|
"- Testez votre fonction pour des valeurs de n entre 0 et 10."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def lapinoux(n: int) -> int:\n",
|
|
" \"\"\" Calcule le nombre de couples de lapins au bout de n mois (n>=0) \"\"\" "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"🏁 **Terminaison** : la fonction termine toujours car elle est constituée d'un boucle finie `for ... range`.\n",
|
|
"\n",
|
|
"🐌 **Complexité** : $O(n)$ car à chaque fois qu'on augmente n de 1 on ajoute un tour de boucle avec 3 affectations et 1 addition."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Suite de Fibonacci\n",
|
|
"\n",
|
|
"Comme vous êtes de bons élèves en mathématiques, il ne vous a pas échappé que ce fonctionnement pouvait se formaliser sous forme de suite mathématique qu'on nomme la **Suite de Fibonacci**.\n",
|
|
"\n",
|
|
"En effet, vous avez pu constater que pour obtenir un terme pour un mois donné, il suffisait de faire la somme des termes des 2 mois précédents : `fibo(0) = 0 ; fibo(1) = 1 ; fibo(n) = fibo(n-1) + fibo(n-2)`.\n",
|
|
"\n",
|
|
"- Reprogrammez la fonction précédente en la nommant `fibo(n)` mais cette fois en utilisant la définition de la suite ci-dessus.\n",
|
|
"\n",
|
|
"- Testez votre fonction pour des valeurs de n entre 0 et 10."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def fibo(n: int) -> int:\n",
|
|
" \"\"\" Calcule les termes de la suite de Fibonacci (n>=0) \"\"\" "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"🏁 **Terminaison** : la fonction termine toujours car elle est constituée d'un boucle finie `for ... range`.\n",
|
|
"\n",
|
|
"🐌 **Complexité** : $O(n)$ car à chaque fois qu'on augmente n de 1 on ajoute un tour de boucle avec 3 affectations et 1 addition."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Récursivité\n",
|
|
"\n",
|
|
"⚠️ En informatique une fonction peut **s'appeler elle-même**, c'est ce qu'on nomme une **fonction récursive**. Faisons un exemple pour voir :"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n",
|
|
"Lancement de la fonction recursive_infinie()\n"
|
|
]
|
|
},
|
|
{
|
|
"ename": "RecursionError",
|
|
"evalue": "maximum recursion depth exceeded while calling a Python object",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
|
"\u001b[0;31mRecursionError\u001b[0m Traceback (most recent call last)",
|
|
"\u001b[0;32m<ipython-input-10-2d19be49f426>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mrecursive_infinie\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mrecursive_infinie\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
|
|
"\u001b[0;32m<ipython-input-10-2d19be49f426>\u001b[0m in \u001b[0;36mrecursive_infinie\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrecursive_infinie\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Lancement de la fonction recursive_infinie()\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mrecursive_infinie\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mrecursive_infinie\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"... last 1 frames repeated, from the frame below ...\n",
|
|
"\u001b[0;32m<ipython-input-10-2d19be49f426>\u001b[0m in \u001b[0;36mrecursive_infinie\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrecursive_infinie\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Lancement de la fonction recursive_infinie()\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mrecursive_infinie\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mrecursive_infinie\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;31mRecursionError\u001b[0m: maximum recursion depth exceeded while calling a Python object"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"def recursive_infinie():\n",
|
|
" print(\"Lancement de la fonction recursive_infinie()\")\n",
|
|
" recursive_infinie()\n",
|
|
" \n",
|
|
"recursive_infinie()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Vous constatez que la fonction **s'appelle elle-même** sans s'arrêter jusqu'à provoquer l'erreur : *RecursionError: maximum recursion depth exceeded while calling a Python object*. Qui se traduit littéralement par : *Ta function ne s'arrête pas gros noob !*\n",
|
|
"\n",
|
|
"⚠️ Quand nous écrivons une **fonction récursive**, il faut s'assurer que la **fonction s'arrête à coup sûr** ! Il faut donc bien écrire le ou les **cas d'arrêt**.\n",
|
|
"\n",
|
|
"Essayons cet autre exemple :"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"On est dans la fonction recursive(10)\n",
|
|
"On est dans la fonction recursive(9)\n",
|
|
"On est dans la fonction recursive(8)\n",
|
|
"On est dans la fonction recursive(7)\n",
|
|
"On est dans la fonction recursive(6)\n",
|
|
"On est dans la fonction recursive(5)\n",
|
|
"On est dans la fonction recursive(4)\n",
|
|
"On est dans la fonction recursive(3)\n",
|
|
"On est dans la fonction recursive(2)\n",
|
|
"On est dans la fonction recursive(1)\n",
|
|
"On est dans la fonction recursive(0)\n",
|
|
"C'est fini !\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"def recursive(n: int):\n",
|
|
" print(f\"On est dans la fonction recursive({n})\")\n",
|
|
" if n <= 0 :\n",
|
|
" print(\"C'est fini !\")\n",
|
|
" else :\n",
|
|
" recursive(n-1)\n",
|
|
" \n",
|
|
"recursive(10)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"- Écrivez la fonction `fibor(n)` pour calculer les termes de la Suite de Fibonacci en utilisant une **fonction récursive**. Pour cela vous devez utiliser le fait que `fibor(n)` doit **retourner** `fibor(n-1) + fibor(n-2)` ! Et pensez aux cas d'arrêt !\n",
|
|
"- Testez votre fonction pour des valeurs de n entre 0 et 10."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def fibor(n: int) -> int:\n",
|
|
" \"\"\" Calcule les termes de la suite de Fibonacci récursivement (n>=0) \"\"\" "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"🏁 **Terminaison** : la fonction termine toujours car elle est appelée récursivement avec des paramètres entiers positifs **décroissants** donc ils arriveront forcément à 0 et 1 ce qui **arrêtera les appels récursifs**.\n",
|
|
"\n",
|
|
"🐌 **Complexité** : $O(A^n)$, chaque appel de la fonction avec un nombre n plus grand déploie un arbre d'appel qui croît exponentiellement.\n",
|
|
"\n",
|
|
"Cette méthode de programmation **récursive** est séduisante car elle permet de **programmer simplement** des problèmes **difficiles** (parcours de structures, etc.). Mais elle a un gros défaut, c'est qu'elle est souvent **peu performante** en terme de **temps de calcul** et **d'efficacité mémoire**. Voyons pourquoi.\n",
|
|
"\n",
|
|
"- Ajouter à votre fonction un `print` qui permet de voir toutes les fonctions appelées. Ensuite testez `fibor(10)`"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def fibor(n: int) -> int:\n",
|
|
" \"\"\" Calcule les termes de la suite de Fibonacci récursivement (n>=0) \"\"\""
|
|
]
|
|
},
|
|
{
|
|
"attachments": {
|
|
"out.svg": {
|
|
"image/svg+xml": [
|
|
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDQuMCAoMCkKIC0tPgo8IS0tIFRpdGxlOiBGaWJvbm5hY2NpIFBhZ2VzOiAxIC0tPgo8c3ZnIHdpZHRoPSI2ODNwdCIgaGVpZ2h0PSIzNTZwdCIKIHZpZXdCb3g9IjAuMDAgMC4wMCA2ODMuMDAgMzU2LjAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDM1MikiPgo8dGl0bGU+Rmlib25uYWNjaTwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9IndoaXRlIiBzdHJva2U9InRyYW5zcGFyZW50IiBwb2ludHM9Ii00LDQgLTQsLTM1MiA2NzksLTM1MiA2NzksNCAtNCw0Ii8+CjxnIGlkPSJjbHVzdDIiIGNsYXNzPSJjbHVzdGVyIj4KPHRpdGxlPmNsdXN0ZXIxPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLWRhc2hhcnJheT0iNSwyIiBkPSJNMjAsLTgwQzIwLC04MCAyMzksLTgwIDIzOSwtODAgMjQ1LC04MCAyNTEsLTg2IDI1MSwtOTIgMjUxLC05MiAyNTEsLTI3MiAyNTEsLTI3MiAyNTEsLTI3OCAyNDUsLTI4NCAyMzksLTI4NCAyMzksLTI4NCAyMCwtMjg0IDIwLC0yODQgMTQsLTI4NCA4LC0yNzggOCwtMjcyIDgsLTI3MiA4LC05MiA4LC05MiA4LC04NiAxNCwtODAgMjAsLTgwIi8+CjwvZz4KPGcgaWQ9ImNsdXN0NCIgY2xhc3M9ImNsdXN0ZXIiPgo8dGl0bGU+Y2x1c3RlcjE8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBzdHJva2UtZGFzaGFycmF5PSIxLDUiIGQ9Ik05OCwtODhDOTgsLTg4IDIzMSwtODggMjMxLC04OCAyMzcsLTg4IDI0MywtOTQgMjQzLC0xMDAgMjQzLC0xMDAgMjQzLC0yMDAgMjQzLC0yMDAgMjQzLC0yMDYgMjM3LC0yMTIgMjMxLC0yMTIgMjMxLC0yMTIgOTgsLTIxMiA5OCwtMjEyIDkyLC0yMTIgODYsLTIwNiA4NiwtMjAwIDg2LC0yMDAgODYsLTEwMCA4NiwtMTAwIDg2LC05NCA5MiwtODggOTgsLTg4Ii8+CjwvZz4KPGcgaWQ9ImNsdXN0NyIgY2xhc3M9ImNsdXN0ZXIiPgo8dGl0bGU+Y2x1c3RlcjI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBzdHJva2UtZGFzaGFycmF5PSIxLDUiIGQ9Ik0yNzEsLTg4QzI3MSwtODggNDA0LC04OCA0MDQsLTg4IDQxMCwtODggNDE2LC05NCA0MTYsLTEwMCA0MTYsLTEwMCA0MTYsLTIwMCA0MTYsLTIwMCA0MTYsLTIwNiA0MTAsLTIxMiA0MDQsLTIxMiA0MDQsLTIxMiAyNzEsLTIxMiAyNzEsLTIxMiAyNjUsLTIxMiAyNTksLTIwNiAyNTksLTIwMCAyNTksLTIwMCAyNTksLTEwMCAyNTksLTEwMCAyNTksLTk0IDI2NSwtODggMjcxLC04OCIvPgo8L2c+CjxnIGlkPSJjbHVzdDkiIGNsYXNzPSJjbHVzdGVyIj4KPHRpdGxlPmNsdXN0ZXIzPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLWRhc2hhcnJheT0iNSwyIiBkPSJNNDM2LC04QzQzNiwtOCA2NTUsLTggNjU1LC04IDY2MSwtOCA2NjcsLTE0IDY2NywtMjAgNjY3LC0yMCA2NjcsLTIwMCA2NjcsLTIwMCA2NjcsLTIwNiA2NjEsLTIxMiA2NTUsLTIxMiA2NTUsLTIxMiA0MzYsLTIxMiA0MzYsLTIxMiA0MzAsLTIxMiA0MjQsLTIwNiA0MjQsLTIwMCA0MjQsLTIwMCA0MjQsLTIwIDQyNCwtMjAgNDI0LC0xNCA0MzAsLTggNDM2LC04Ii8+CjwvZz4KPGcgaWQ9ImNsdXN0MTEiIGNsYXNzPSJjbHVzdGVyIj4KPHRpdGxlPmNsdXN0ZXI0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLWRhc2hhcnJheT0iMSw1IiBkPSJNNTE0LC0xNkM1MTQsLTE2IDY0NywtMTYgNjQ3LC0xNiA2NTMsLTE2IDY1OSwtMjIgNjU5LC0yOCA2NTksLTI4IDY1OSwtMTI4IDY1OSwtMTI4IDY1OSwtMTM0IDY1MywtMTQwIDY0NywtMTQwIDY0NywtMTQwIDUxNCwtMTQwIDUxNCwtMTQwIDUwOCwtMTQwIDUwMiwtMTM0IDUwMiwtMTI4IDUwMiwtMTI4IDUwMiwtMjggNTAyLC0yOCA1MDIsLTIyIDUwOCwtMTYgNTE0LC0xNiIvPgo8L2c+CjwhLS0gZmliKDYpIC0tPgo8ZyBpZD0ibm9kZTEiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmZpYig2KTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyMzEiIGN5PSItMzMwIiByeD0iMzAuNTkiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzEiIHk9Ii0zMjYuMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5maWIoNik8L3RleHQ+CjwvZz4KPCEtLSBmaWI0IC0tPgo8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmZpYjQ8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMTY1IiBjeT0iLTI1OCIgcng9IjMwLjU5IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTY1IiB5PSItMjU0LjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+ZmliKDQpPC90ZXh0Pgo8L2c+CjwhLS0gZmliKDYpJiM0NTsmZ3Q7ZmliNCAtLT4KPGcgaWQ9ImVkZ2UxIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5maWIoNikmIzQ1OyZndDtmaWI0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTIxNi42OCwtMzEzLjgxQzIwNy43NywtMzA0LjM2IDE5Ni4xNSwtMjkyLjA0IDE4Ni4xOSwtMjgxLjQ4Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE4OC43LC0yNzkuMDMgMTc5LjI5LC0yNzQuMTYgMTgzLjYxLC0yODMuODQgMTg4LjcsLTI3OS4wMyIvPgo8L2c+CjwhLS0gZmliNSAtLT4KPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5maWI1PC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjMzNyIgY3k9Ii0yNTgiIHJ4PSIzMC41OSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMzNyIgeT0iLTI1NC4zIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmZpYig1KTwvdGV4dD4KPC9nPgo8IS0tIGZpYig2KSYjNDU7Jmd0O2ZpYjUgLS0+CjxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+ZmliKDYpJiM0NTsmZ3Q7ZmliNTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0yNTAuOTQsLTMxNS44M0MyNjcuMzMsLTMwNS4wMSAyOTAuNzQsLTI4OS41NSAzMDkuMDEsLTI3Ny40OSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzMTEuMDksLTI4MC4zIDMxNy41MSwtMjcxLjg3IDMwNy4yNCwtMjc0LjQ2IDMxMS4wOSwtMjgwLjMiLz4KPC9nPgo8IS0tIGZpYjIgLS0+CjxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZmliMjwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI0NyIgY3k9Ii0xODYiIHJ4PSIzMC41OSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ3IiB5PSItMTgyLjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+ZmliKDIpPC90ZXh0Pgo8L2c+CjwhLS0gZmliNCYjNDU7Jmd0O2ZpYjIgLS0+CjxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+ZmliNCYjNDU7Jmd0O2ZpYjI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMTQyLjM4LC0yNDUuN0MxMjUuNDUsLTIzNy4wMSAxMDEuODgsLTIyNC40MiA4MiwtMjEyIDc5LjIxLC0yMTAuMjYgNzYuMzUsLTIwOC4zOCA3My41MiwtMjA2LjQ2Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijc1LjQ0LC0yMDMuNTMgNjUuMjQsLTIwMC42NyA3MS40MywtMjA5LjI3IDc1LjQ0LC0yMDMuNTMiLz4KPC9nPgo8IS0tIGZpYjMgLS0+CjxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZmliMzwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIxNjUiIGN5PSItMTg2IiByeD0iMzAuNTkiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNjUiIHk9Ii0xODIuMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5maWIoMyk8L3RleHQ+CjwvZz4KPCEtLSBmaWI0JiM0NTsmZ3Q7ZmliMyAtLT4KPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5maWI0JiM0NTsmZ3Q7ZmliMzwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0xNjUsLTIzOS43QzE2NSwtMjMxLjk4IDE2NSwtMjIyLjcxIDE2NSwtMjE0LjExIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE2OC41LC0yMTQuMSAxNjUsLTIwNC4xIDE2MS41LC0yMTQuMSAxNjguNSwtMjE0LjEiLz4KPC9nPgo8IS0tIGZpYjMzIC0tPgo8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmZpYjMzPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjMzNyIgY3k9Ii0xODYiIHJ4PSIzMC41OSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMzNyIgeT0iLTE4Mi4zIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmZpYigzKTwvdGV4dD4KPC9nPgo8IS0tIGZpYjUmIzQ1OyZndDtmaWIzMyAtLT4KPGcgaWQ9ImVkZ2U3IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5maWI1JiM0NTsmZ3Q7ZmliMzM8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzM3LC0yMzkuN0MzMzcsLTIzMS45OCAzMzcsLTIyMi43MSAzMzcsLTIxNC4xMSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzNDAuNSwtMjE0LjEgMzM3LC0yMDQuMSAzMzMuNSwtMjE0LjEgMzQwLjUsLTIxNC4xIi8+CjwvZz4KPCEtLSBmaWI0NCAtLT4KPGcgaWQ9Im5vZGU5IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5maWI0NDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI0NjMiIGN5PSItMTg2IiByeD0iMzAuNTkiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NjMiIHk9Ii0xODIuMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5maWIoNCk8L3RleHQ+CjwvZz4KPCEtLSBmaWI1JiM0NTsmZ3Q7ZmliNDQgLS0+CjxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+ZmliNSYjNDU7Jmd0O2ZpYjQ0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTM1OC45NCwtMjQ1LjMzQzM3NS43MywtMjM2LjM1IDM5OS40MiwtMjIzLjU2IDQyMCwtMjEyIDQyNC4yOSwtMjA5LjU5IDQyOC44LC0yMDcuMDEgNDMzLjIzLC0yMDQuNDYiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDM1LjE4LC0yMDcuMzggNDQyLjA4LC0xOTkuMzMgNDMxLjY3LC0yMDEuMzIgNDM1LjE4LC0yMDcuMzgiLz4KPC9nPgo8IS0tIGZpYjEgLS0+CjxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZmliMTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIxMjUiIGN5PSItMTE0IiByeD0iMzAuNTkiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMjUiIHk9Ii0xMTAuMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5maWIoMSk8L3RleHQ+CjwvZz4KPCEtLSBmaWIzJiM0NTsmZ3Q7ZmliMSAtLT4KPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5maWIzJiM0NTsmZ3Q7ZmliMTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0xNTUuNzIsLTE2OC43NkMxNTAuOTUsLTE2MC40IDE0NS4wMSwtMTUwLjAyIDEzOS42MywtMTQwLjYxIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE0Mi41MSwtMTM4LjU4IDEzNC41LC0xMzEuNjMgMTM2LjQzLC0xNDIuMDUgMTQyLjUxLC0xMzguNTgiLz4KPC9nPgo8IS0tIGZpYjIyIC0tPgo8ZyBpZD0ibm9kZTciIGNsYXNzPSJub2RlIj4KPHRpdGxlPmZpYjIyPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjIwNCIgY3k9Ii0xMTQiIHJ4PSIzMC41OSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwNCIgeT0iLTExMC4zIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmZpYigyKTwvdGV4dD4KPC9nPgo8IS0tIGZpYjMmIzQ1OyZndDtmaWIyMiAtLT4KPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5maWIzJiM0NTsmZ3Q7ZmliMjI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMTc0LjA1LC0xNjguNzZDMTc4LjcsLTE2MC40IDE4NC40OSwtMTUwLjAyIDE4OS43MywtMTQwLjYxIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE5Mi45MiwtMTQyLjA3IDE5NC43MywtMTMxLjYzIDE4Ni44MSwtMTM4LjY3IDE5Mi45MiwtMTQyLjA3Ii8+CjwvZz4KPCEtLSBmaWIxMSAtLT4KPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZmliMTE8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMjk4IiBjeT0iLTExNCIgcng9IjMwLjU5IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjk4IiB5PSItMTEwLjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+ZmliKDEpPC90ZXh0Pgo8L2c+CjwhLS0gZmliMzMmIzQ1OyZndDtmaWIxMSAtLT4KPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5maWIzMyYjNDU7Jmd0O2ZpYjExPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTMyNy45NSwtMTY4Ljc2QzMyMy4zLC0xNjAuNCAzMTcuNTEsLTE1MC4wMiAzMTIuMjcsLTE0MC42MSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzMTUuMTksLTEzOC42NyAzMDcuMjcsLTEzMS42MyAzMDkuMDgsLTE0Mi4wNyAzMTUuMTksLTEzOC42NyIvPgo8L2c+CjwhLS0gZmliMjIyIC0tPgo8ZyBpZD0ibm9kZTExIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5maWIyMjI8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMzc3IiBjeT0iLTExNCIgcng9IjMwLjU5IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzc3IiB5PSItMTEwLjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+ZmliKDIpPC90ZXh0Pgo8L2c+CjwhLS0gZmliMzMmIzQ1OyZndDtmaWIyMjIgLS0+CjxnIGlkPSJlZGdlMTAiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmZpYjMzJiM0NTsmZ3Q7ZmliMjIyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTM0Ni4yOCwtMTY4Ljc2QzM1MS4wNSwtMTYwLjQgMzU2Ljk5LC0xNTAuMDIgMzYyLjM3LC0xNDAuNjEiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzY1LjU3LC0xNDIuMDUgMzY3LjUsLTEzMS42MyAzNTkuNDksLTEzOC41OCAzNjUuNTcsLTE0Mi4wNSIvPgo8L2c+CjwhLS0gZmliMjIyMiAtLT4KPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZmliMjIyMjwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI0NjMiIGN5PSItMTE0IiByeD0iMzAuNTkiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NjMiIHk9Ii0xMTAuMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5maWIoMik8L3RleHQ+CjwvZz4KPCEtLSBmaWI0NCYjNDU7Jmd0O2ZpYjIyMjIgLS0+CjxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmZpYjQ0JiM0NTsmZ3Q7ZmliMjIyMjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00NjMsLTE2Ny43QzQ2MywtMTU5Ljk4IDQ2MywtMTUwLjcxIDQ2MywtMTQyLjExIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQ2Ni41LC0xNDIuMSA0NjMsLTEzMi4xIDQ1OS41LC0xNDIuMSA0NjYuNSwtMTQyLjEiLz4KPC9nPgo8IS0tIGZpYjMzMyAtLT4KPGcgaWQ9Im5vZGUxMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZmliMzMzPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjU0MiIgY3k9Ii0xMTQiIHJ4PSIzMC41OSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU0MiIgeT0iLTExMC4zIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmZpYigzKTwvdGV4dD4KPC9nPgo8IS0tIGZpYjQ0JiM0NTsmZ3Q7ZmliMzMzIC0tPgo8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5maWI0NCYjNDU7Jmd0O2ZpYjMzMzwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00NzkuMzcsLTE3MC41QzQ5MC40OSwtMTYwLjY0IDUwNS4zOSwtMTQ3LjQ0IDUxNy44NywtMTM2LjM4Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjUyMC40OSwtMTM4Ljc0IDUyNS42NSwtMTI5LjQ5IDUxNS44NSwtMTMzLjUgNTIwLjQ5LC0xMzguNzQiLz4KPC9nPgo8IS0tIGZpYjExMSAtLT4KPGcgaWQ9Im5vZGUxNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZmliMTExPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjU0MSIgY3k9Ii00MiIgcng9IjMwLjU5IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTQxIiB5PSItMzguMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5maWIoMSk8L3RleHQ+CjwvZz4KPCEtLSBmaWIzMzMmIzQ1OyZndDtmaWIxMTEgLS0+CjxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmZpYjMzMyYjNDU7Jmd0O2ZpYjExMTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik01NDEuNzUsLTk1LjdDNTQxLjY0LC04Ny45OCA1NDEuNTEsLTc4LjcxIDU0MS4zOSwtNzAuMTEiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTQ0Ljg5LC03MC4wNSA1NDEuMjQsLTYwLjEgNTM3Ljg5LC03MC4xNSA1NDQuODksLTcwLjA1Ii8+CjwvZz4KPCEtLSBmaWIyMjIyMiAtLT4KPGcgaWQ9Im5vZGUxNSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZmliMjIyMjI8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iNjIwIiBjeT0iLTQyIiByeD0iMzAuNTkiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2MjAiIHk9Ii0zOC4zIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmZpYigyKTwvdGV4dD4KPC9nPgo8IS0tIGZpYjMzMyYjNDU7Jmd0O2ZpYjIyMjIyIC0tPgo8ZyBpZD0iZWRnZTE0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5maWIzMzMmIzQ1OyZndDtmaWIyMjIyMjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik01NTguMTYsLTk4LjVDNTY5LjE0LC04OC42NCA1ODMuODUsLTc1LjQ0IDU5Ni4xNywtNjQuMzgiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTk4Ljc1LC02Ni43NyA2MDMuODYsLTU3LjQ5IDU5NC4wOCwtNjEuNTYgNTk4Ljc1LC02Ni43NyIvPgo8L2c+CjwvZz4KPC9zdmc+Cg=="
|
|
]
|
|
}
|
|
},
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Vous constatez que la fonction `fibor` est lancée **177 fois** ! Et surtout, on calcule les mêmes valeurs plusieurs fois, par exemple on calcule **8 fois** `fibor(5)` !\n",
|
|
"\n",
|
|
"Cette image montre bien le problème pour `fibor(6)` :\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"On voit dans l'arbre des appels successifs que `fibor(4)` est calculé 2 fois et `fibor(3)` 3 fois. Ce qui est évidemment **inefficace**.\n",
|
|
"\n",
|
|
"On peut, en général, améliorer la **récursivité** en faisant de la **récursivité terminale**, mais nous approfondirons ce problème plus tard...\n",
|
|
"\n",
|
|
"⚠️ Retenons pour l'instant que la **récursivité** permet de programmer avec **simplicité et élégance** des problème **difficiles** mais souvent au **détriment de la performance**.\n",
|
|
"\n",
|
|
"# Programmation dynamique\n",
|
|
"\n",
|
|
"Le gros défaut de l'algorithme précédent est qu'il **recalcule** sans cesse les **mêmes termes** inutilement. Il existe une méthode de programmation qui répond justement à ce problème :\n",
|
|
"\n",
|
|
"⚠️ La **programmation dynamique** est une méthode de programmation qui consiste à **enregistrer des résultats de calculs intermédiaires** pour les **réutiliser plus tard afin d'éviter de les recalculer**.\n",
|
|
"\n",
|
|
"- Écrivez la fonction `fibordyn` qui calcule les termes de la suite de Fibonacci **récursivement** mais avec une **liste pour enregistrer les résultats intermédiaires** que vous consulterez avant de recommencer un calcul.\n",
|
|
"\n",
|
|
"- Testez votre fonction avec n = 10."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def fibordyn(n: int) -> int:\n",
|
|
" \"\"\" Lanceur de la fonction fibor (n>=0) : initialisation du tableau de résultats \"\"\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"🏁 **Terminaison** : la fonction termine toujours car elle est appelée récursivement avec des paramètres entiers positifs **décroissants** donc ils arriveront forcément à 0 et 1 ce qui **arrêtera les appels récursifs**.\n",
|
|
"\n",
|
|
"🐌 **Complexité** : $O(n)$, on appelle n+1 fois la fonction `fibor()` qui contient des tests, des affectations, des additions mais aussi des **accès à des listes qui se font en temps constant en Python**.\n",
|
|
"\n",
|
|
"⚠️ Je vous conseille de faire un arbre d'appel avec `n = 5` pour comprendre exactement comment marche ce programme car c'est plus subtil qu'il n'y parait ! C'est l'occasion d'utiliser [Python Tutor](http://www.pythontutor.com/visualize.html#mode=edit) !\n",
|
|
"\n",
|
|
"# Performances\n",
|
|
"\n",
|
|
"Nous avons donc 4 algorithmes différents pour calculer la croissance de la population de nos couples de lapins. Testons leurs performances.\n",
|
|
"\n",
|
|
"- **Copier-coller** la définition de votre fonction `lapinoux` au début de la cellule ci-dessous et exécutez la cellule pour analyser les performances."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Test avec n=10 - Test avec n=1010 - Test avec n=2010 - Test avec n=3010 - Test avec n=4010 - Test avec n=5010 - Test avec n=6010 - Test avec n=7010 - Test avec n=8010 - Test avec n=9010 - Test avec n=10010 - Test avec n=11010 - Test avec n=12010 - Test avec n=13010 - Test avec n=14010 - Test avec n=15010 - Test avec n=16010 - Test avec n=17010 - Test avec n=18010 - Test avec n=19010 - Test avec n=20010 - Test avec n=21010 - Test avec n=22010 - Test avec n=23010 - Test avec n=24010 - Test avec n=25010 - Test avec n=26010 - Test avec n=27010 - Test avec n=28010 - Test avec n=29010 - Test avec n=30010 - Test avec n=31010 - Test avec n=32010 - Test avec n=33010 - Test avec n=34010 - Test avec n=35010 - Test avec n=36010 - Test avec n=37010 - Test avec n=38010 - Test avec n=39010 - Test avec n=40010 - Test avec n=41010 - Test avec n=42010 - Test avec n=43010 - Test avec n=44010 - Test avec n=45010 - Test avec n=46010 - Test avec n=47010 - Test avec n=48010 - Test avec n=49010 - Test avec n=50010 - Test avec n=51010 - Test avec n=52010 - Test avec n=53010 - Test avec n=54010 - Test avec n=55010 - Test avec n=56010 - Test avec n=57010 - Test avec n=58010 - Test avec n=59010 - Test avec n=60010 - Test avec n=61010 - Test avec n=62010 - Test avec n=63010 - Test avec n=64010 - Test avec n=65010 - Test avec n=66010 - Test avec n=67010 - Test avec n=68010 - Test avec n=69010 - Test avec n=70010 - Test avec n=71010 - Test avec n=72010 - Test avec n=73010 - Test avec n=74010 - Test avec n=75010 - Test avec n=76010 - Test avec n=77010 - Test avec n=78010 - Test avec n=79010 - Test avec n=80010 - Test avec n=81010 - Test avec n=82010 - Test avec n=83010 - Test avec n=84010 - Test avec n=85010 - Test avec n=86010 - Test avec n=87010 - Test avec n=88010 - Test avec n=89010 - Test avec n=90010 - Test avec n=91010 - Test avec n=92010 - Test avec n=93010 - Test avec n=94010 - Test avec n=95010 - Test avec n=96010 - Test avec n=97010 - Test avec n=98010 - Test avec n=99010 - "
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"application/javascript": [
|
|
"/* Put everything inside the global mpl namespace */\n",
|
|
"window.mpl = {};\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.get_websocket_type = function() {\n",
|
|
" if (typeof(WebSocket) !== 'undefined') {\n",
|
|
" return WebSocket;\n",
|
|
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
|
" return MozWebSocket;\n",
|
|
" } else {\n",
|
|
" alert('Your browser does not have WebSocket support. ' +\n",
|
|
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
|
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
|
" 'have to enable WebSockets in about:config.');\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
|
" this.id = figure_id;\n",
|
|
"\n",
|
|
" this.ws = websocket;\n",
|
|
"\n",
|
|
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
|
"\n",
|
|
" if (!this.supports_binary) {\n",
|
|
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
|
" if (warnings) {\n",
|
|
" warnings.style.display = 'block';\n",
|
|
" warnings.textContent = (\n",
|
|
" \"This browser does not support binary websocket messages. \" +\n",
|
|
" \"Performance may be slow.\");\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj = new Image();\n",
|
|
"\n",
|
|
" this.context = undefined;\n",
|
|
" this.message = undefined;\n",
|
|
" this.canvas = undefined;\n",
|
|
" this.rubberband_canvas = undefined;\n",
|
|
" this.rubberband_context = undefined;\n",
|
|
" this.format_dropdown = undefined;\n",
|
|
"\n",
|
|
" this.image_mode = 'full';\n",
|
|
"\n",
|
|
" this.root = $('<div/>');\n",
|
|
" this._root_extra_style(this.root)\n",
|
|
" this.root.attr('style', 'display: inline-block');\n",
|
|
"\n",
|
|
" $(parent_element).append(this.root);\n",
|
|
"\n",
|
|
" this._init_header(this);\n",
|
|
" this._init_canvas(this);\n",
|
|
" this._init_toolbar(this);\n",
|
|
"\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" this.waiting = false;\n",
|
|
"\n",
|
|
" this.ws.onopen = function () {\n",
|
|
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
|
" fig.send_message(\"send_image_mode\", {});\n",
|
|
" if (mpl.ratio != 1) {\n",
|
|
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
|
" }\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj.onload = function() {\n",
|
|
" if (fig.image_mode == 'full') {\n",
|
|
" // Full images could contain transparency (where diff images\n",
|
|
" // almost always do), so we need to clear the canvas so that\n",
|
|
" // there is no ghosting.\n",
|
|
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
" }\n",
|
|
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
|
" };\n",
|
|
"\n",
|
|
" this.imageObj.onunload = function() {\n",
|
|
" fig.ws.close();\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
|
"\n",
|
|
" this.ondownload = ondownload;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_header = function() {\n",
|
|
" var titlebar = $(\n",
|
|
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
|
" 'ui-helper-clearfix\"/>');\n",
|
|
" var titletext = $(\n",
|
|
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
|
" 'text-align: center; padding: 3px;\"/>');\n",
|
|
" titlebar.append(titletext)\n",
|
|
" this.root.append(titlebar);\n",
|
|
" this.header = titletext[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_canvas = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var canvas_div = $('<div/>');\n",
|
|
"\n",
|
|
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
|
"\n",
|
|
" function canvas_keyboard_event(event) {\n",
|
|
" return fig.key_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
|
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
|
" this.canvas_div = canvas_div\n",
|
|
" this._canvas_extra_style(canvas_div)\n",
|
|
" this.root.append(canvas_div);\n",
|
|
"\n",
|
|
" var canvas = $('<canvas/>');\n",
|
|
" canvas.addClass('mpl-canvas');\n",
|
|
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
|
"\n",
|
|
" this.canvas = canvas[0];\n",
|
|
" this.context = canvas[0].getContext(\"2d\");\n",
|
|
"\n",
|
|
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
|
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
|
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
|
"\tthis.context.msBackingStorePixelRatio ||\n",
|
|
"\tthis.context.oBackingStorePixelRatio ||\n",
|
|
"\tthis.context.backingStorePixelRatio || 1;\n",
|
|
"\n",
|
|
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
|
"\n",
|
|
" var rubberband = $('<canvas/>');\n",
|
|
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
|
"\n",
|
|
" var pass_mouse_events = true;\n",
|
|
"\n",
|
|
" canvas_div.resizable({\n",
|
|
" start: function(event, ui) {\n",
|
|
" pass_mouse_events = false;\n",
|
|
" },\n",
|
|
" resize: function(event, ui) {\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" stop: function(event, ui) {\n",
|
|
" pass_mouse_events = true;\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" });\n",
|
|
"\n",
|
|
" function mouse_event_fn(event) {\n",
|
|
" if (pass_mouse_events)\n",
|
|
" return fig.mouse_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
|
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
|
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
|
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
|
"\n",
|
|
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
|
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
|
"\n",
|
|
" canvas_div.on(\"wheel\", function (event) {\n",
|
|
" event = event.originalEvent;\n",
|
|
" event['data'] = 'scroll'\n",
|
|
" if (event.deltaY < 0) {\n",
|
|
" event.step = 1;\n",
|
|
" } else {\n",
|
|
" event.step = -1;\n",
|
|
" }\n",
|
|
" mouse_event_fn(event);\n",
|
|
" });\n",
|
|
"\n",
|
|
" canvas_div.append(canvas);\n",
|
|
" canvas_div.append(rubberband);\n",
|
|
"\n",
|
|
" this.rubberband = rubberband;\n",
|
|
" this.rubberband_canvas = rubberband[0];\n",
|
|
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
|
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
|
"\n",
|
|
" this._resize_canvas = function(width, height) {\n",
|
|
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
|
" // canvas in synch.\n",
|
|
" canvas_div.css('width', width)\n",
|
|
" canvas_div.css('height', height)\n",
|
|
"\n",
|
|
" canvas.attr('width', width * mpl.ratio);\n",
|
|
" canvas.attr('height', height * mpl.ratio);\n",
|
|
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
|
"\n",
|
|
" rubberband.attr('width', width);\n",
|
|
" rubberband.attr('height', height);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
|
" // upon first draw.\n",
|
|
" this._resize_canvas(600, 600);\n",
|
|
"\n",
|
|
" // Disable right mouse context menu.\n",
|
|
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
|
" return false;\n",
|
|
" });\n",
|
|
"\n",
|
|
" function set_focus () {\n",
|
|
" canvas.focus();\n",
|
|
" canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" window.setTimeout(set_focus, 100);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>');\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) {\n",
|
|
" // put a spacer in here.\n",
|
|
" continue;\n",
|
|
" }\n",
|
|
" var button = $('<button/>');\n",
|
|
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
|
" 'ui-button-icon-only');\n",
|
|
" button.attr('role', 'button');\n",
|
|
" button.attr('aria-disabled', 'false');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
"\n",
|
|
" var icon_img = $('<span/>');\n",
|
|
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
|
" icon_img.addClass(image);\n",
|
|
" icon_img.addClass('ui-corner-all');\n",
|
|
"\n",
|
|
" var tooltip_span = $('<span/>');\n",
|
|
" tooltip_span.addClass('ui-button-text');\n",
|
|
" tooltip_span.html(tooltip);\n",
|
|
"\n",
|
|
" button.append(icon_img);\n",
|
|
" button.append(tooltip_span);\n",
|
|
"\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fmt_picker_span = $('<span/>');\n",
|
|
"\n",
|
|
" var fmt_picker = $('<select/>');\n",
|
|
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
|
" fmt_picker_span.append(fmt_picker);\n",
|
|
" nav_element.append(fmt_picker_span);\n",
|
|
" this.format_dropdown = fmt_picker[0];\n",
|
|
"\n",
|
|
" for (var ind in mpl.extensions) {\n",
|
|
" var fmt = mpl.extensions[ind];\n",
|
|
" var option = $(\n",
|
|
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
|
" fmt_picker.append(option);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add hover states to the ui-buttons\n",
|
|
" $( \".ui-button\" ).hover(\n",
|
|
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
|
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
|
" );\n",
|
|
"\n",
|
|
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
|
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
|
" // which will in turn request a refresh of the image.\n",
|
|
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
|
" properties['type'] = type;\n",
|
|
" properties['figure_id'] = this.id;\n",
|
|
" this.ws.send(JSON.stringify(properties));\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_draw_message = function() {\n",
|
|
" if (!this.waiting) {\n",
|
|
" this.waiting = true;\n",
|
|
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" var format_dropdown = fig.format_dropdown;\n",
|
|
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
|
" fig.ondownload(fig, format);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
|
" var size = msg['size'];\n",
|
|
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
|
" fig._resize_canvas(size[0], size[1]);\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
|
" var x0 = msg['x0'] / mpl.ratio;\n",
|
|
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
|
" var x1 = msg['x1'] / mpl.ratio;\n",
|
|
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
|
" x0 = Math.floor(x0) + 0.5;\n",
|
|
" y0 = Math.floor(y0) + 0.5;\n",
|
|
" x1 = Math.floor(x1) + 0.5;\n",
|
|
" y1 = Math.floor(y1) + 0.5;\n",
|
|
" var min_x = Math.min(x0, x1);\n",
|
|
" var min_y = Math.min(y0, y1);\n",
|
|
" var width = Math.abs(x1 - x0);\n",
|
|
" var height = Math.abs(y1 - y0);\n",
|
|
"\n",
|
|
" fig.rubberband_context.clearRect(\n",
|
|
" 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
|
|
"\n",
|
|
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
|
" // Updates the figure title.\n",
|
|
" fig.header.textContent = msg['label'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
|
" var cursor = msg['cursor'];\n",
|
|
" switch(cursor)\n",
|
|
" {\n",
|
|
" case 0:\n",
|
|
" cursor = 'pointer';\n",
|
|
" break;\n",
|
|
" case 1:\n",
|
|
" cursor = 'default';\n",
|
|
" break;\n",
|
|
" case 2:\n",
|
|
" cursor = 'crosshair';\n",
|
|
" break;\n",
|
|
" case 3:\n",
|
|
" cursor = 'move';\n",
|
|
" break;\n",
|
|
" }\n",
|
|
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
|
" fig.message.textContent = msg['message'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
|
" // Request the server to send over a new figure.\n",
|
|
" fig.send_draw_message();\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
|
" fig.image_mode = msg['mode'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Called whenever the canvas gets updated.\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"// A function to construct a web socket function for onmessage handling.\n",
|
|
"// Called in the figure constructor.\n",
|
|
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
|
" return function socket_on_message(evt) {\n",
|
|
" if (evt.data instanceof Blob) {\n",
|
|
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
|
" * transferred with MIME type text/plain:\" errors on\n",
|
|
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
|
" * to be part of the websocket stream */\n",
|
|
" evt.data.type = \"image/png\";\n",
|
|
"\n",
|
|
" /* Free the memory for the previous frames */\n",
|
|
" if (fig.imageObj.src) {\n",
|
|
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
|
" fig.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
|
" evt.data);\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
|
" fig.imageObj.src = evt.data;\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var msg = JSON.parse(evt.data);\n",
|
|
" var msg_type = msg['type'];\n",
|
|
"\n",
|
|
" // Call the \"handle_{type}\" callback, which takes\n",
|
|
" // the figure and JSON message as its only arguments.\n",
|
|
" try {\n",
|
|
" var callback = fig[\"handle_\" + msg_type];\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (callback) {\n",
|
|
" try {\n",
|
|
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
|
" callback(fig, msg);\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
|
" }\n",
|
|
" }\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
|
"mpl.findpos = function(e) {\n",
|
|
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
|
" var targ;\n",
|
|
" if (!e)\n",
|
|
" e = window.event;\n",
|
|
" if (e.target)\n",
|
|
" targ = e.target;\n",
|
|
" else if (e.srcElement)\n",
|
|
" targ = e.srcElement;\n",
|
|
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
|
" targ = targ.parentNode;\n",
|
|
"\n",
|
|
" // jQuery normalizes the pageX and pageY\n",
|
|
" // pageX,Y are the mouse positions relative to the document\n",
|
|
" // offset() returns the position of the element relative to the document\n",
|
|
" var x = e.pageX - $(targ).offset().left;\n",
|
|
" var y = e.pageY - $(targ).offset().top;\n",
|
|
"\n",
|
|
" return {\"x\": x, \"y\": y};\n",
|
|
"};\n",
|
|
"\n",
|
|
"/*\n",
|
|
" * return a copy of an object with only non-object keys\n",
|
|
" * we need this to avoid circular references\n",
|
|
" * http://stackoverflow.com/a/24161582/3208463\n",
|
|
" */\n",
|
|
"function simpleKeys (original) {\n",
|
|
" return Object.keys(original).reduce(function (obj, key) {\n",
|
|
" if (typeof original[key] !== 'object')\n",
|
|
" obj[key] = original[key]\n",
|
|
" return obj;\n",
|
|
" }, {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
|
" var canvas_pos = mpl.findpos(event)\n",
|
|
"\n",
|
|
" if (name === 'button_press')\n",
|
|
" {\n",
|
|
" this.canvas.focus();\n",
|
|
" this.canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" var x = canvas_pos.x * mpl.ratio;\n",
|
|
" var y = canvas_pos.y * mpl.ratio;\n",
|
|
"\n",
|
|
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
|
" step: event.step,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
"\n",
|
|
" /* This prevents the web browser from automatically changing to\n",
|
|
" * the text insertion cursor when the button is pressed. We want\n",
|
|
" * to control all of the cursor setting manually through the\n",
|
|
" * 'cursor' event from matplotlib */\n",
|
|
" event.preventDefault();\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" // Handle any extra behaviour associated with a key event\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
|
"\n",
|
|
" // Prevent repeat events\n",
|
|
" if (name == 'key_press')\n",
|
|
" {\n",
|
|
" if (event.which === this._key)\n",
|
|
" return;\n",
|
|
" else\n",
|
|
" this._key = event.which;\n",
|
|
" }\n",
|
|
" if (name == 'key_release')\n",
|
|
" this._key = null;\n",
|
|
"\n",
|
|
" var value = '';\n",
|
|
" if (event.ctrlKey && event.which != 17)\n",
|
|
" value += \"ctrl+\";\n",
|
|
" if (event.altKey && event.which != 18)\n",
|
|
" value += \"alt+\";\n",
|
|
" if (event.shiftKey && event.which != 16)\n",
|
|
" value += \"shift+\";\n",
|
|
"\n",
|
|
" value += 'k';\n",
|
|
" value += event.which.toString();\n",
|
|
"\n",
|
|
" this._key_event_extra(event, name);\n",
|
|
"\n",
|
|
" this.send_message(name, {key: value,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
|
" if (name == 'download') {\n",
|
|
" this.handle_save(this, null);\n",
|
|
" } else {\n",
|
|
" this.send_message(\"toolbar_button\", {name: name});\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
|
" this.message.textContent = tooltip;\n",
|
|
"};\n",
|
|
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
|
"\n",
|
|
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
|
"\n",
|
|
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
|
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
|
" // object with the appropriate methods. Currently this is a non binary\n",
|
|
" // socket, so there is still some room for performance tuning.\n",
|
|
" var ws = {};\n",
|
|
"\n",
|
|
" ws.close = function() {\n",
|
|
" comm.close()\n",
|
|
" };\n",
|
|
" ws.send = function(m) {\n",
|
|
" //console.log('sending', m);\n",
|
|
" comm.send(m);\n",
|
|
" };\n",
|
|
" // Register the callback with on_msg.\n",
|
|
" comm.on_msg(function(msg) {\n",
|
|
" //console.log('receiving', msg['content']['data'], msg);\n",
|
|
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
|
|
" ws.onmessage(msg['content']['data'])\n",
|
|
" });\n",
|
|
" return ws;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
|
" // This is the function which gets called when the mpl process\n",
|
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
|
"\n",
|
|
" var id = msg.content.data.id;\n",
|
|
" // Get hold of the div created by the display call when the Comm\n",
|
|
" // socket was opened in Python.\n",
|
|
" var element = $(\"#\" + id);\n",
|
|
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
|
"\n",
|
|
" function ondownload(figure, format) {\n",
|
|
" window.open(figure.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fig = new mpl.figure(id, ws_proxy,\n",
|
|
" ondownload,\n",
|
|
" element.get(0));\n",
|
|
"\n",
|
|
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
|
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
|
" ws_proxy.onopen();\n",
|
|
"\n",
|
|
" fig.parent_element = element.get(0);\n",
|
|
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
|
" if (!fig.cell_info) {\n",
|
|
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var output_index = fig.cell_info[2]\n",
|
|
" var cell = fig.cell_info[0];\n",
|
|
"\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
|
" var width = fig.canvas.width/mpl.ratio\n",
|
|
" fig.root.unbind('remove')\n",
|
|
"\n",
|
|
" // Update the output cell to use the data from the current canvas.\n",
|
|
" fig.push_to_output();\n",
|
|
" var dataURL = fig.canvas.toDataURL();\n",
|
|
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
|
" // the notebook keyboard shortcuts fail.\n",
|
|
" IPython.keyboard_manager.enable()\n",
|
|
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
|
" fig.close_ws(fig, msg);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
|
" fig.send_message('closing', msg);\n",
|
|
" // fig.ws.close()\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
|
" // Turn the data on the canvas into data in the output cell.\n",
|
|
" var width = this.canvas.width/mpl.ratio\n",
|
|
" var dataURL = this.canvas.toDataURL();\n",
|
|
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Tell IPython that the notebook contents must change.\n",
|
|
" IPython.notebook.set_dirty(true);\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
" var fig = this;\n",
|
|
" // Wait a second, then push the new image to the DOM so\n",
|
|
" // that it is saved nicely (might be nice to debounce this).\n",
|
|
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>');\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) { continue; };\n",
|
|
"\n",
|
|
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add the status bar.\n",
|
|
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"\n",
|
|
" // Add the close button to the window.\n",
|
|
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
|
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
|
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
|
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
|
" buttongrp.append(button);\n",
|
|
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
|
" titlebar.prepend(buttongrp);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
|
" var fig = this\n",
|
|
" el.on(\"remove\", function(){\n",
|
|
"\tfig.close_ws(fig, {});\n",
|
|
" });\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
|
" // this is important to make the div 'focusable\n",
|
|
" el.attr('tabindex', 0)\n",
|
|
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
|
" // off when our div gets focus\n",
|
|
"\n",
|
|
" // location in version 3\n",
|
|
" if (IPython.notebook.keyboard_manager) {\n",
|
|
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
" else {\n",
|
|
" // location in version 2\n",
|
|
" IPython.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" var manager = IPython.notebook.keyboard_manager;\n",
|
|
" if (!manager)\n",
|
|
" manager = IPython.keyboard_manager;\n",
|
|
"\n",
|
|
" // Check for shift+enter\n",
|
|
" if (event.shiftKey && event.which == 13) {\n",
|
|
" this.canvas_div.blur();\n",
|
|
" // select the cell after this one\n",
|
|
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
|
|
" IPython.notebook.select(index + 1);\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" fig.ondownload(fig, null);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.find_output_cell = function(html_output) {\n",
|
|
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
|
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
|
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
|
" // our purposes (turning an active figure into a static one), is too late.\n",
|
|
" var cells = IPython.notebook.get_cells();\n",
|
|
" var ncells = cells.length;\n",
|
|
" for (var i=0; i<ncells; i++) {\n",
|
|
" var cell = cells[i];\n",
|
|
" if (cell.cell_type === 'code'){\n",
|
|
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
|
" var data = cell.output_area.outputs[j];\n",
|
|
" if (data.data) {\n",
|
|
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
|
" data = data.data;\n",
|
|
" }\n",
|
|
" if (data['text/html'] == html_output) {\n",
|
|
" return [cell, data, j];\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"// Register the function which deals with the matplotlib target/channel.\n",
|
|
"// The kernel may be null if the page has been refreshed.\n",
|
|
"if (IPython.notebook.kernel != null) {\n",
|
|
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
|
"}\n"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.Javascript object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdeXyU5b3+8bGQhEItPfbUuvYJaiBpUUu0lB4FTrVWbV3ani72Vymn9lhALUsXJoCSIiSAK1UBNcatErBCjPIQAmFJQhL2sATCHgghCUuArGSbmev3R8zImACB+853Zu653q/X80eHSfLw6bz0cjLzjANEREREFFIc/j4BIiIiIpLFAUhEREQUYjgAiYiIiEIMByARERFRiOEAJCIiIgoxHIBEREREIYYDkIiIiCjEcAASERERhRgOQCIiIqIQwwFIREREFGI4AImIiIhCDAcgERERUYjhACQiIiIKMRyARERERCGGA5CIiIgoxHAAEhEREYUYDkAiIiKiEMMBSERERBRiOACJiIiIQgwHIBEREVGI4QAkIiIiCjEcgEREREQhhgOQiIiIKMRwABIRERGFGA5AIiIiohDDAUhEREQUYjgAiYiIiEIMByARERFRiOEAJCIiIgoxHIBEREREIYYDkIiIiCjEcAASERERhRgOQCIiIqIQwwFIREREFGI4AImIiIhCDAcgERERUYjhACQiIiIKMRyARERERCGGA5CIiIgoxHAAEhEREYUYDkAiIiKiEMMBSERERBRiOACJiIiIQgwHIBEREVGI4QAkIiIiCjEcgEREREQhhgOQiIiIKMRwABIRERGFGA5AIiIiohDDAUhEREQUYjgAiYiIiEIMByARERFRiOEAJCIiIgoxHIBEREREIYYDkIiIiCjEcAASERERhRgOQAVutxulpaWoqqpCdXU1Dx48ePDgwSMIjqqqKpSWlsLtdvt7SvgNB6CC0tJSOBwOHjx48ODBg0cQHqWlpf6eEn7DAaigqqrK+wDS+V8mlZWVSElJQWVlpd//KykUDvZmaxMPtmZrEw9drduewKmqqvL3lPAbDkAF1dXVcDgcqK6u1vp9m5ubkZaWhubmZq3flzrG3nLYWg5by2FrObpad9W/v4MJB6ACDkAzsLcctpbD1nLYWg4HoD4cgAo4AM3A3nLYWg5by2FrORyA+nAAKuAANAN7y2FrOWwth63lcADqwwGogAPQDOwth63lsLUctpbDAagPB6ACDkAzsLcctpbD1nLYWg4HoD4cgAo4AM3A3nLYWg5by2FrORyA+nAAKuAANAN7y2FrOWwth63lcADq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55578Kc//QlAa/OoqKh294mKikJiYqL3e95zzz3t7hMeHu79F0mwmz9/Pvr374+GhgYAvgOQrfWKiIhAREQEJkyYgIKCArz++uvo0aMH3nvvPQDsrZPH40FcXBwuu+wydO/eHZdddpn37w6wtS5fHICB1vWee+7B448/7vPnbf8ezs/Pv5i/alDiAAwg53rgTZs2Df369fPTWQWuJ554ApZl+bw4uO0fMOXl5T73/b//+z/ce++9AM79D5gf/ehHGDFiBIBzj+6bbroJ06dPB+D7D62zhYWFYf78+Zf+FwsQhw8fxpVXXomtW7d6b+toALK1HmFhYfjBD37gc9uf//xnDBo0CAB76zR//nxcd911mD9/PrZv3473338fV1xxBd59910AbK3LuQZgoHQ9e1S2OXLkCBwOB9auXXsxf9WgxAEYQPgr4M576qmncN1117V7mj7QfsUQzD7++GM4HA5069bNezgcDlx22WXo1q0b9u/fz9Yafetb38If//hHn9vmzJmDa665BgAf2zpdd911eO2113xumzp1qvc/tNlaD/4KOLBxAAaYgQMHYtSoUT63xcTE8E0gn/F4PHjyySdxzTXXYO/evR3++VVXXYWZM2d6b2tqaurwRcYffvih9z7l5eUdvsh4/fr13vusW7euwxcZn/1fswsWLDDixdsAUFNTg8LCQp/j9ttvx6OPPorCwkK21uy3v/1tuzeBjB071vusIHvrc8UVV2DOnDk+tyUmJnp/rcjWepzrTSCB0nXOnDn42te+5nNpmBkzZvBNIOQfbZeBSU5ORlFREcaOHYtevXrh0KFD/j61gDBq1Cj07t0bWVlZqKio8B5nzpzx3mfGjBno3bs3UlNTUVhYiN/+9rcdXmbguuuuw4oVK1BQUIC77rqrw8sM3HLLLVi7di3Wrl2Lm2++ucPLDNx9990oKCjAihUrcN111wXt5Rs64+xfAQNsrdOGDRvQvXt3JCQkYN++fZg3bx569uyJDz74wHsf9tZj+PDhuPbaa72XgUlNTcV//ud/Yvz48d77sPWlqa2txZYtW7BlyxY4HA689NJL2PL/27lDlViiMIDjWBwNu6BlNymYDKYFm3oeQNEsGxarrGxaDAb3JcziC1hsFh9B0Ga0C2IxfjdcXGYupsteVu73+8GUw4TDCcN/BuZ7fJyOMvtJ5/r+/h6dTieOj4/j+fk5bm9vo91uGwPD/FxdXcX6+nosLi5Gr9ebjjjh9xvld9f19fX0nq9Bo91uN6qqir29velfwl8+Pz9jOBxOB+4eHBzE6+tr4563t7fo9/vRarWi1WpFv9//dtDo/v5+LC8vx+rqagyHw8ZIgf/NnwHorGfr7u4utra2oqqq2NzcbPwFHOG8Z+Xj4yNGo1Gsra3F0tJSbGxsxMXFReNLkLP+Ow8PD98+oweDQUT8vHN9enqK3d3dqKoqut1uTCaTFF//IgQgAEA6AhAAIBkBCACQjAAEAEhGAAIAJCMAAQCSEYAAAMkIQACAZAQgAEAyAhAAIBkBCACQjAAEqCmlxNnZWYzH41hZWYlOpxOXl5fz3hbATAlAgJpSSrTb7ZhMJvHy8hI3NzexsLAQ9/f3894awMwIQICaUkrs7Ow01ra3t+P8/HxOOwKYPQEIUFNKidPT08ba4eFhnJyczGlHALMnAAFqSikxGo0aa0dHRzEYDOazIYB/QAAC1AhAIAMBCFAjAIEMBCBAjQAEMhCAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkMwv0Ud38RCkLRsAAAAASUVORK5CYII=\" width=\"640\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"\n",
|
|
"Temps d'execution de lapinoux avec n=99010 : 0.08472695129999934\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Copiez ici le code de la fonction lapinoux\n",
|
|
"\n",
|
|
"# Mesure du temps et tracés\n",
|
|
"import time\n",
|
|
"%matplotlib notebook\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"n = [i for i in range(10, 100000, 1000)]\n",
|
|
"liste_temps = []\n",
|
|
"\n",
|
|
"for i in n:\n",
|
|
" print(f\"Test avec n={i}\", end = \" - \")\n",
|
|
" temps = 0.0\n",
|
|
" nb_loops = 10\n",
|
|
" for test in range(nb_loops):\n",
|
|
" start = time.process_time()\n",
|
|
" lapinoux(i)\n",
|
|
" temps += time.process_time() - start\n",
|
|
" temps /= nb_loops\n",
|
|
" liste_temps.append(temps)\n",
|
|
"\n",
|
|
"plt.plot(n, liste_temps, label=\"lapinoux\")\n",
|
|
"plt.xlabel(\"n\")\n",
|
|
"plt.grid(True)\n",
|
|
"print(f\"\\n\\nTemps d'execution de lapinoux avec n={n[-1]} : {liste_temps[-1]}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"On constate que le temps d'exécution en fonction de `n` n'est **pas linéaire** comme la complexité le laissait supposer... ???\n",
|
|
"\n",
|
|
"- **Copier-coller** la définition de votre fonction `fibo` au début de la cellule suivante et exécutez la cellule pour analyser les performances."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Test avec n=10 - Test avec n=1010 - Test avec n=2010 - Test avec n=3010 - Test avec n=4010 - Test avec n=5010 - Test avec n=6010 - Test avec n=7010 - Test avec n=8010 - Test avec n=9010 - Test avec n=10010 - Test avec n=11010 - Test avec n=12010 - Test avec n=13010 - Test avec n=14010 - Test avec n=15010 - Test avec n=16010 - Test avec n=17010 - Test avec n=18010 - Test avec n=19010 - Test avec n=20010 - Test avec n=21010 - Test avec n=22010 - Test avec n=23010 - Test avec n=24010 - Test avec n=25010 - Test avec n=26010 - Test avec n=27010 - Test avec n=28010 - Test avec n=29010 - Test avec n=30010 - Test avec n=31010 - Test avec n=32010 - Test avec n=33010 - Test avec n=34010 - Test avec n=35010 - Test avec n=36010 - Test avec n=37010 - Test avec n=38010 - Test avec n=39010 - Test avec n=40010 - Test avec n=41010 - Test avec n=42010 - Test avec n=43010 - Test avec n=44010 - Test avec n=45010 - Test avec n=46010 - Test avec n=47010 - Test avec n=48010 - Test avec n=49010 - Test avec n=50010 - Test avec n=51010 - Test avec n=52010 - Test avec n=53010 - Test avec n=54010 - Test avec n=55010 - Test avec n=56010 - Test avec n=57010 - Test avec n=58010 - Test avec n=59010 - Test avec n=60010 - Test avec n=61010 - Test avec n=62010 - Test avec n=63010 - Test avec n=64010 - Test avec n=65010 - Test avec n=66010 - Test avec n=67010 - Test avec n=68010 - Test avec n=69010 - Test avec n=70010 - Test avec n=71010 - Test avec n=72010 - Test avec n=73010 - Test avec n=74010 - Test avec n=75010 - Test avec n=76010 - Test avec n=77010 - Test avec n=78010 - Test avec n=79010 - Test avec n=80010 - Test avec n=81010 - Test avec n=82010 - Test avec n=83010 - Test avec n=84010 - Test avec n=85010 - Test avec n=86010 - Test avec n=87010 - Test avec n=88010 - Test avec n=89010 - Test avec n=90010 - Test avec n=91010 - Test avec n=92010 - Test avec n=93010 - Test avec n=94010 - Test avec n=95010 - Test avec n=96010 - Test avec n=97010 - Test avec n=98010 - Test avec n=99010 - "
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"application/javascript": [
|
|
"/* Put everything inside the global mpl namespace */\n",
|
|
"window.mpl = {};\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.get_websocket_type = function() {\n",
|
|
" if (typeof(WebSocket) !== 'undefined') {\n",
|
|
" return WebSocket;\n",
|
|
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
|
" return MozWebSocket;\n",
|
|
" } else {\n",
|
|
" alert('Your browser does not have WebSocket support. ' +\n",
|
|
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
|
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
|
" 'have to enable WebSockets in about:config.');\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
|
" this.id = figure_id;\n",
|
|
"\n",
|
|
" this.ws = websocket;\n",
|
|
"\n",
|
|
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
|
"\n",
|
|
" if (!this.supports_binary) {\n",
|
|
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
|
" if (warnings) {\n",
|
|
" warnings.style.display = 'block';\n",
|
|
" warnings.textContent = (\n",
|
|
" \"This browser does not support binary websocket messages. \" +\n",
|
|
" \"Performance may be slow.\");\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj = new Image();\n",
|
|
"\n",
|
|
" this.context = undefined;\n",
|
|
" this.message = undefined;\n",
|
|
" this.canvas = undefined;\n",
|
|
" this.rubberband_canvas = undefined;\n",
|
|
" this.rubberband_context = undefined;\n",
|
|
" this.format_dropdown = undefined;\n",
|
|
"\n",
|
|
" this.image_mode = 'full';\n",
|
|
"\n",
|
|
" this.root = $('<div/>');\n",
|
|
" this._root_extra_style(this.root)\n",
|
|
" this.root.attr('style', 'display: inline-block');\n",
|
|
"\n",
|
|
" $(parent_element).append(this.root);\n",
|
|
"\n",
|
|
" this._init_header(this);\n",
|
|
" this._init_canvas(this);\n",
|
|
" this._init_toolbar(this);\n",
|
|
"\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" this.waiting = false;\n",
|
|
"\n",
|
|
" this.ws.onopen = function () {\n",
|
|
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
|
" fig.send_message(\"send_image_mode\", {});\n",
|
|
" if (mpl.ratio != 1) {\n",
|
|
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
|
" }\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj.onload = function() {\n",
|
|
" if (fig.image_mode == 'full') {\n",
|
|
" // Full images could contain transparency (where diff images\n",
|
|
" // almost always do), so we need to clear the canvas so that\n",
|
|
" // there is no ghosting.\n",
|
|
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
" }\n",
|
|
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
|
" };\n",
|
|
"\n",
|
|
" this.imageObj.onunload = function() {\n",
|
|
" fig.ws.close();\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
|
"\n",
|
|
" this.ondownload = ondownload;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_header = function() {\n",
|
|
" var titlebar = $(\n",
|
|
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
|
" 'ui-helper-clearfix\"/>');\n",
|
|
" var titletext = $(\n",
|
|
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
|
" 'text-align: center; padding: 3px;\"/>');\n",
|
|
" titlebar.append(titletext)\n",
|
|
" this.root.append(titlebar);\n",
|
|
" this.header = titletext[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_canvas = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var canvas_div = $('<div/>');\n",
|
|
"\n",
|
|
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
|
"\n",
|
|
" function canvas_keyboard_event(event) {\n",
|
|
" return fig.key_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
|
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
|
" this.canvas_div = canvas_div\n",
|
|
" this._canvas_extra_style(canvas_div)\n",
|
|
" this.root.append(canvas_div);\n",
|
|
"\n",
|
|
" var canvas = $('<canvas/>');\n",
|
|
" canvas.addClass('mpl-canvas');\n",
|
|
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
|
"\n",
|
|
" this.canvas = canvas[0];\n",
|
|
" this.context = canvas[0].getContext(\"2d\");\n",
|
|
"\n",
|
|
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
|
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
|
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
|
"\tthis.context.msBackingStorePixelRatio ||\n",
|
|
"\tthis.context.oBackingStorePixelRatio ||\n",
|
|
"\tthis.context.backingStorePixelRatio || 1;\n",
|
|
"\n",
|
|
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
|
"\n",
|
|
" var rubberband = $('<canvas/>');\n",
|
|
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
|
"\n",
|
|
" var pass_mouse_events = true;\n",
|
|
"\n",
|
|
" canvas_div.resizable({\n",
|
|
" start: function(event, ui) {\n",
|
|
" pass_mouse_events = false;\n",
|
|
" },\n",
|
|
" resize: function(event, ui) {\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" stop: function(event, ui) {\n",
|
|
" pass_mouse_events = true;\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" });\n",
|
|
"\n",
|
|
" function mouse_event_fn(event) {\n",
|
|
" if (pass_mouse_events)\n",
|
|
" return fig.mouse_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
|
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
|
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
|
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
|
"\n",
|
|
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
|
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
|
"\n",
|
|
" canvas_div.on(\"wheel\", function (event) {\n",
|
|
" event = event.originalEvent;\n",
|
|
" event['data'] = 'scroll'\n",
|
|
" if (event.deltaY < 0) {\n",
|
|
" event.step = 1;\n",
|
|
" } else {\n",
|
|
" event.step = -1;\n",
|
|
" }\n",
|
|
" mouse_event_fn(event);\n",
|
|
" });\n",
|
|
"\n",
|
|
" canvas_div.append(canvas);\n",
|
|
" canvas_div.append(rubberband);\n",
|
|
"\n",
|
|
" this.rubberband = rubberband;\n",
|
|
" this.rubberband_canvas = rubberband[0];\n",
|
|
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
|
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
|
"\n",
|
|
" this._resize_canvas = function(width, height) {\n",
|
|
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
|
" // canvas in synch.\n",
|
|
" canvas_div.css('width', width)\n",
|
|
" canvas_div.css('height', height)\n",
|
|
"\n",
|
|
" canvas.attr('width', width * mpl.ratio);\n",
|
|
" canvas.attr('height', height * mpl.ratio);\n",
|
|
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
|
"\n",
|
|
" rubberband.attr('width', width);\n",
|
|
" rubberband.attr('height', height);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
|
" // upon first draw.\n",
|
|
" this._resize_canvas(600, 600);\n",
|
|
"\n",
|
|
" // Disable right mouse context menu.\n",
|
|
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
|
" return false;\n",
|
|
" });\n",
|
|
"\n",
|
|
" function set_focus () {\n",
|
|
" canvas.focus();\n",
|
|
" canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" window.setTimeout(set_focus, 100);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>');\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) {\n",
|
|
" // put a spacer in here.\n",
|
|
" continue;\n",
|
|
" }\n",
|
|
" var button = $('<button/>');\n",
|
|
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
|
" 'ui-button-icon-only');\n",
|
|
" button.attr('role', 'button');\n",
|
|
" button.attr('aria-disabled', 'false');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
"\n",
|
|
" var icon_img = $('<span/>');\n",
|
|
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
|
" icon_img.addClass(image);\n",
|
|
" icon_img.addClass('ui-corner-all');\n",
|
|
"\n",
|
|
" var tooltip_span = $('<span/>');\n",
|
|
" tooltip_span.addClass('ui-button-text');\n",
|
|
" tooltip_span.html(tooltip);\n",
|
|
"\n",
|
|
" button.append(icon_img);\n",
|
|
" button.append(tooltip_span);\n",
|
|
"\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fmt_picker_span = $('<span/>');\n",
|
|
"\n",
|
|
" var fmt_picker = $('<select/>');\n",
|
|
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
|
" fmt_picker_span.append(fmt_picker);\n",
|
|
" nav_element.append(fmt_picker_span);\n",
|
|
" this.format_dropdown = fmt_picker[0];\n",
|
|
"\n",
|
|
" for (var ind in mpl.extensions) {\n",
|
|
" var fmt = mpl.extensions[ind];\n",
|
|
" var option = $(\n",
|
|
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
|
" fmt_picker.append(option);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add hover states to the ui-buttons\n",
|
|
" $( \".ui-button\" ).hover(\n",
|
|
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
|
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
|
" );\n",
|
|
"\n",
|
|
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
|
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
|
" // which will in turn request a refresh of the image.\n",
|
|
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
|
" properties['type'] = type;\n",
|
|
" properties['figure_id'] = this.id;\n",
|
|
" this.ws.send(JSON.stringify(properties));\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_draw_message = function() {\n",
|
|
" if (!this.waiting) {\n",
|
|
" this.waiting = true;\n",
|
|
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" var format_dropdown = fig.format_dropdown;\n",
|
|
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
|
" fig.ondownload(fig, format);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
|
" var size = msg['size'];\n",
|
|
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
|
" fig._resize_canvas(size[0], size[1]);\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
|
" var x0 = msg['x0'] / mpl.ratio;\n",
|
|
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
|
" var x1 = msg['x1'] / mpl.ratio;\n",
|
|
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
|
" x0 = Math.floor(x0) + 0.5;\n",
|
|
" y0 = Math.floor(y0) + 0.5;\n",
|
|
" x1 = Math.floor(x1) + 0.5;\n",
|
|
" y1 = Math.floor(y1) + 0.5;\n",
|
|
" var min_x = Math.min(x0, x1);\n",
|
|
" var min_y = Math.min(y0, y1);\n",
|
|
" var width = Math.abs(x1 - x0);\n",
|
|
" var height = Math.abs(y1 - y0);\n",
|
|
"\n",
|
|
" fig.rubberband_context.clearRect(\n",
|
|
" 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
|
|
"\n",
|
|
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
|
" // Updates the figure title.\n",
|
|
" fig.header.textContent = msg['label'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
|
" var cursor = msg['cursor'];\n",
|
|
" switch(cursor)\n",
|
|
" {\n",
|
|
" case 0:\n",
|
|
" cursor = 'pointer';\n",
|
|
" break;\n",
|
|
" case 1:\n",
|
|
" cursor = 'default';\n",
|
|
" break;\n",
|
|
" case 2:\n",
|
|
" cursor = 'crosshair';\n",
|
|
" break;\n",
|
|
" case 3:\n",
|
|
" cursor = 'move';\n",
|
|
" break;\n",
|
|
" }\n",
|
|
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
|
" fig.message.textContent = msg['message'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
|
" // Request the server to send over a new figure.\n",
|
|
" fig.send_draw_message();\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
|
" fig.image_mode = msg['mode'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Called whenever the canvas gets updated.\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"// A function to construct a web socket function for onmessage handling.\n",
|
|
"// Called in the figure constructor.\n",
|
|
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
|
" return function socket_on_message(evt) {\n",
|
|
" if (evt.data instanceof Blob) {\n",
|
|
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
|
" * transferred with MIME type text/plain:\" errors on\n",
|
|
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
|
" * to be part of the websocket stream */\n",
|
|
" evt.data.type = \"image/png\";\n",
|
|
"\n",
|
|
" /* Free the memory for the previous frames */\n",
|
|
" if (fig.imageObj.src) {\n",
|
|
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
|
" fig.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
|
" evt.data);\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
|
" fig.imageObj.src = evt.data;\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var msg = JSON.parse(evt.data);\n",
|
|
" var msg_type = msg['type'];\n",
|
|
"\n",
|
|
" // Call the \"handle_{type}\" callback, which takes\n",
|
|
" // the figure and JSON message as its only arguments.\n",
|
|
" try {\n",
|
|
" var callback = fig[\"handle_\" + msg_type];\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (callback) {\n",
|
|
" try {\n",
|
|
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
|
" callback(fig, msg);\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
|
" }\n",
|
|
" }\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
|
"mpl.findpos = function(e) {\n",
|
|
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
|
" var targ;\n",
|
|
" if (!e)\n",
|
|
" e = window.event;\n",
|
|
" if (e.target)\n",
|
|
" targ = e.target;\n",
|
|
" else if (e.srcElement)\n",
|
|
" targ = e.srcElement;\n",
|
|
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
|
" targ = targ.parentNode;\n",
|
|
"\n",
|
|
" // jQuery normalizes the pageX and pageY\n",
|
|
" // pageX,Y are the mouse positions relative to the document\n",
|
|
" // offset() returns the position of the element relative to the document\n",
|
|
" var x = e.pageX - $(targ).offset().left;\n",
|
|
" var y = e.pageY - $(targ).offset().top;\n",
|
|
"\n",
|
|
" return {\"x\": x, \"y\": y};\n",
|
|
"};\n",
|
|
"\n",
|
|
"/*\n",
|
|
" * return a copy of an object with only non-object keys\n",
|
|
" * we need this to avoid circular references\n",
|
|
" * http://stackoverflow.com/a/24161582/3208463\n",
|
|
" */\n",
|
|
"function simpleKeys (original) {\n",
|
|
" return Object.keys(original).reduce(function (obj, key) {\n",
|
|
" if (typeof original[key] !== 'object')\n",
|
|
" obj[key] = original[key]\n",
|
|
" return obj;\n",
|
|
" }, {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
|
" var canvas_pos = mpl.findpos(event)\n",
|
|
"\n",
|
|
" if (name === 'button_press')\n",
|
|
" {\n",
|
|
" this.canvas.focus();\n",
|
|
" this.canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" var x = canvas_pos.x * mpl.ratio;\n",
|
|
" var y = canvas_pos.y * mpl.ratio;\n",
|
|
"\n",
|
|
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
|
" step: event.step,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
"\n",
|
|
" /* This prevents the web browser from automatically changing to\n",
|
|
" * the text insertion cursor when the button is pressed. We want\n",
|
|
" * to control all of the cursor setting manually through the\n",
|
|
" * 'cursor' event from matplotlib */\n",
|
|
" event.preventDefault();\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" // Handle any extra behaviour associated with a key event\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
|
"\n",
|
|
" // Prevent repeat events\n",
|
|
" if (name == 'key_press')\n",
|
|
" {\n",
|
|
" if (event.which === this._key)\n",
|
|
" return;\n",
|
|
" else\n",
|
|
" this._key = event.which;\n",
|
|
" }\n",
|
|
" if (name == 'key_release')\n",
|
|
" this._key = null;\n",
|
|
"\n",
|
|
" var value = '';\n",
|
|
" if (event.ctrlKey && event.which != 17)\n",
|
|
" value += \"ctrl+\";\n",
|
|
" if (event.altKey && event.which != 18)\n",
|
|
" value += \"alt+\";\n",
|
|
" if (event.shiftKey && event.which != 16)\n",
|
|
" value += \"shift+\";\n",
|
|
"\n",
|
|
" value += 'k';\n",
|
|
" value += event.which.toString();\n",
|
|
"\n",
|
|
" this._key_event_extra(event, name);\n",
|
|
"\n",
|
|
" this.send_message(name, {key: value,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
|
" if (name == 'download') {\n",
|
|
" this.handle_save(this, null);\n",
|
|
" } else {\n",
|
|
" this.send_message(\"toolbar_button\", {name: name});\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
|
" this.message.textContent = tooltip;\n",
|
|
"};\n",
|
|
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
|
"\n",
|
|
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
|
"\n",
|
|
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
|
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
|
" // object with the appropriate methods. Currently this is a non binary\n",
|
|
" // socket, so there is still some room for performance tuning.\n",
|
|
" var ws = {};\n",
|
|
"\n",
|
|
" ws.close = function() {\n",
|
|
" comm.close()\n",
|
|
" };\n",
|
|
" ws.send = function(m) {\n",
|
|
" //console.log('sending', m);\n",
|
|
" comm.send(m);\n",
|
|
" };\n",
|
|
" // Register the callback with on_msg.\n",
|
|
" comm.on_msg(function(msg) {\n",
|
|
" //console.log('receiving', msg['content']['data'], msg);\n",
|
|
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
|
|
" ws.onmessage(msg['content']['data'])\n",
|
|
" });\n",
|
|
" return ws;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
|
" // This is the function which gets called when the mpl process\n",
|
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
|
"\n",
|
|
" var id = msg.content.data.id;\n",
|
|
" // Get hold of the div created by the display call when the Comm\n",
|
|
" // socket was opened in Python.\n",
|
|
" var element = $(\"#\" + id);\n",
|
|
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
|
"\n",
|
|
" function ondownload(figure, format) {\n",
|
|
" window.open(figure.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fig = new mpl.figure(id, ws_proxy,\n",
|
|
" ondownload,\n",
|
|
" element.get(0));\n",
|
|
"\n",
|
|
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
|
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
|
" ws_proxy.onopen();\n",
|
|
"\n",
|
|
" fig.parent_element = element.get(0);\n",
|
|
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
|
" if (!fig.cell_info) {\n",
|
|
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var output_index = fig.cell_info[2]\n",
|
|
" var cell = fig.cell_info[0];\n",
|
|
"\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
|
" var width = fig.canvas.width/mpl.ratio\n",
|
|
" fig.root.unbind('remove')\n",
|
|
"\n",
|
|
" // Update the output cell to use the data from the current canvas.\n",
|
|
" fig.push_to_output();\n",
|
|
" var dataURL = fig.canvas.toDataURL();\n",
|
|
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
|
" // the notebook keyboard shortcuts fail.\n",
|
|
" IPython.keyboard_manager.enable()\n",
|
|
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
|
" fig.close_ws(fig, msg);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
|
" fig.send_message('closing', msg);\n",
|
|
" // fig.ws.close()\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
|
" // Turn the data on the canvas into data in the output cell.\n",
|
|
" var width = this.canvas.width/mpl.ratio\n",
|
|
" var dataURL = this.canvas.toDataURL();\n",
|
|
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Tell IPython that the notebook contents must change.\n",
|
|
" IPython.notebook.set_dirty(true);\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
" var fig = this;\n",
|
|
" // Wait a second, then push the new image to the DOM so\n",
|
|
" // that it is saved nicely (might be nice to debounce this).\n",
|
|
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>');\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) { continue; };\n",
|
|
"\n",
|
|
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add the status bar.\n",
|
|
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"\n",
|
|
" // Add the close button to the window.\n",
|
|
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
|
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
|
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
|
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
|
" buttongrp.append(button);\n",
|
|
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
|
" titlebar.prepend(buttongrp);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
|
" var fig = this\n",
|
|
" el.on(\"remove\", function(){\n",
|
|
"\tfig.close_ws(fig, {});\n",
|
|
" });\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
|
" // this is important to make the div 'focusable\n",
|
|
" el.attr('tabindex', 0)\n",
|
|
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
|
" // off when our div gets focus\n",
|
|
"\n",
|
|
" // location in version 3\n",
|
|
" if (IPython.notebook.keyboard_manager) {\n",
|
|
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
" else {\n",
|
|
" // location in version 2\n",
|
|
" IPython.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" var manager = IPython.notebook.keyboard_manager;\n",
|
|
" if (!manager)\n",
|
|
" manager = IPython.keyboard_manager;\n",
|
|
"\n",
|
|
" // Check for shift+enter\n",
|
|
" if (event.shiftKey && event.which == 13) {\n",
|
|
" this.canvas_div.blur();\n",
|
|
" // select the cell after this one\n",
|
|
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
|
|
" IPython.notebook.select(index + 1);\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" fig.ondownload(fig, null);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.find_output_cell = function(html_output) {\n",
|
|
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
|
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
|
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
|
" // our purposes (turning an active figure into a static one), is too late.\n",
|
|
" var cells = IPython.notebook.get_cells();\n",
|
|
" var ncells = cells.length;\n",
|
|
" for (var i=0; i<ncells; i++) {\n",
|
|
" var cell = cells[i];\n",
|
|
" if (cell.cell_type === 'code'){\n",
|
|
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
|
" var data = cell.output_area.outputs[j];\n",
|
|
" if (data.data) {\n",
|
|
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
|
" data = data.data;\n",
|
|
" }\n",
|
|
" if (data['text/html'] == html_output) {\n",
|
|
" return [cell, data, j];\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"// Register the function which deals with the matplotlib target/channel.\n",
|
|
"// The kernel may be null if the page has been refreshed.\n",
|
|
"if (IPython.notebook.kernel != null) {\n",
|
|
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
|
"}\n"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.Javascript object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdeXiU9b3+8bGQhEotPfaqVaudoAaSilv0h5xW4Ki12tZqj6e12rp0s+BSAj09TBAkIiSAirgBaowLSgCFEGUSlrAkIQl7WALDHhJCwhYgCYRkkpm5f39EHhkTIOH7zWdmvnO/ruv5o5NJ8vDuXHgzyTxjAxERERGFFVugT4CIiIiIZHEAEhEREYUZDkAiIiKiMMMBSERERBRmOACJiIiIwgwHIBEREVGY4QAkIiIiCjMcgERERERhhgOQiIiIKMxwABIRERGFGQ5AIiIiojDDAUhEREQUZjgAiYiIiMIMByARERFRmOEAJCIiIgozHIBEREREYYYDkIiIiCjMcAASERERhRkOQCIiIqIwwwFIREREFGY4AImIiIjCDAcgERERUZjhACQiIiIKMxyARERERGGGA5CIiIgozHAAEhEREYUZDkAiIiKiMMMBSERERBRmOACJiIiIwgwHIBEREVGY4QAkIiIiCjMcgERERERhhgOQiIiIKMxwABIRERGFGQ5AIiIiojDDAUhEREQUZjgAiYiIiMIMByARERFRmOEAJCIiIgozHIBEREREYYYDkIiIiCjMcAASERERhRkOQCIiIqIwwwFIREREFGY4AImIiIjCDAcgERERUZjhACQiIiIKMxyARERERGGGA5CIiIgozHAAEhEREYUZDkAiIiKiMMMBSERERBRmOACJiIiIwgwHIBEREVGY4QAkIiIiCjMcgERERERhhgNQgdfrRUVFBWpqalBbW8uDBw8ePHjwCIGjpqYGFRUV8Hq9gZ4SAcMBqKCiogI2m40HDx48ePDgEYJHRUVFoKdEwHAAKqipqbEeQDr/ZVJdXY309HRUV1cH/F9J4XCwN1ubeLA1W5t46Gp9+gmcmpqaQE+JgOEAVFBbWwubzYba2lqtX7epqQmZmZloamrS+nWpbewth63lsLUctpajq3Vn/fc7lHAAKuAANAN7y2FrOWwth63lcADqwwGogAPQDOwth63lsLUctpbDAagPB6ACDkAzsLcctpbD1nLYWg4HoD4cgAo4AM3A3nLYWg5by2FrORyA+nAAKuAANAN7y2FrOWwth63lcADqwwGogAPQDOwth63lsLUctpbDAagPB6ACDkAzsLcctpbD1nLYWg4H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\" width=\"640\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"\n",
|
|
"Temps d'execution de fibo avec n=99010 : 0.08640494139999859\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Copiez ici le code de la fonction fibo\n",
|
|
"\n",
|
|
"# Mesure du temps et tracés\n",
|
|
"import time\n",
|
|
"%matplotlib notebook\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"n = [i for i in range(10, 100000, 1000)]\n",
|
|
"liste_temps = []\n",
|
|
"\n",
|
|
"for i in n:\n",
|
|
" print(f\"Test avec n={i}\", end = \" - \")\n",
|
|
" temps = 0.0\n",
|
|
" nb_loops = 10\n",
|
|
" for test in range(nb_loops):\n",
|
|
" start = time.process_time()\n",
|
|
" fibo(i)\n",
|
|
" temps += time.process_time() - start\n",
|
|
" temps /= nb_loops\n",
|
|
" liste_temps.append(temps)\n",
|
|
"\n",
|
|
"plt.plot(n, liste_temps, label=\"fibo\")\n",
|
|
"plt.xlabel(\"n\")\n",
|
|
"plt.grid(True)\n",
|
|
"print(f\"\\n\\nTemps d'execution de fibo avec n={n[-1]} : {liste_temps[-1]}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Nous obtenons des résultats identiques à la fonction précédente, ce qui est normal puisque ces fonctions sont presques identiques.\n",
|
|
"\n",
|
|
"- **Copier-coller** la définition de votre fonction `fibor` au début de la cellule suivante et exécutez la cellule pour analyser les performances."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Test avec n=5 - Test avec n=7 - Test avec n=9 - Test avec n=11 - Test avec n=13 - Test avec n=15 - Test avec n=17 - Test avec n=19 - Test avec n=21 - Test avec n=23 - Test avec n=25 - Test avec n=27 - Test avec n=29 - Test avec n=31 - Test avec n=33 - Test avec n=35 - Test avec n=37 - Test avec n=39 - "
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"application/javascript": [
|
|
"/* Put everything inside the global mpl namespace */\n",
|
|
"window.mpl = {};\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.get_websocket_type = function() {\n",
|
|
" if (typeof(WebSocket) !== 'undefined') {\n",
|
|
" return WebSocket;\n",
|
|
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
|
" return MozWebSocket;\n",
|
|
" } else {\n",
|
|
" alert('Your browser does not have WebSocket support. ' +\n",
|
|
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
|
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
|
" 'have to enable WebSockets in about:config.');\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
|
" this.id = figure_id;\n",
|
|
"\n",
|
|
" this.ws = websocket;\n",
|
|
"\n",
|
|
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
|
"\n",
|
|
" if (!this.supports_binary) {\n",
|
|
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
|
" if (warnings) {\n",
|
|
" warnings.style.display = 'block';\n",
|
|
" warnings.textContent = (\n",
|
|
" \"This browser does not support binary websocket messages. \" +\n",
|
|
" \"Performance may be slow.\");\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj = new Image();\n",
|
|
"\n",
|
|
" this.context = undefined;\n",
|
|
" this.message = undefined;\n",
|
|
" this.canvas = undefined;\n",
|
|
" this.rubberband_canvas = undefined;\n",
|
|
" this.rubberband_context = undefined;\n",
|
|
" this.format_dropdown = undefined;\n",
|
|
"\n",
|
|
" this.image_mode = 'full';\n",
|
|
"\n",
|
|
" this.root = $('<div/>');\n",
|
|
" this._root_extra_style(this.root)\n",
|
|
" this.root.attr('style', 'display: inline-block');\n",
|
|
"\n",
|
|
" $(parent_element).append(this.root);\n",
|
|
"\n",
|
|
" this._init_header(this);\n",
|
|
" this._init_canvas(this);\n",
|
|
" this._init_toolbar(this);\n",
|
|
"\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" this.waiting = false;\n",
|
|
"\n",
|
|
" this.ws.onopen = function () {\n",
|
|
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
|
" fig.send_message(\"send_image_mode\", {});\n",
|
|
" if (mpl.ratio != 1) {\n",
|
|
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
|
" }\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj.onload = function() {\n",
|
|
" if (fig.image_mode == 'full') {\n",
|
|
" // Full images could contain transparency (where diff images\n",
|
|
" // almost always do), so we need to clear the canvas so that\n",
|
|
" // there is no ghosting.\n",
|
|
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
" }\n",
|
|
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
|
" };\n",
|
|
"\n",
|
|
" this.imageObj.onunload = function() {\n",
|
|
" fig.ws.close();\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
|
"\n",
|
|
" this.ondownload = ondownload;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_header = function() {\n",
|
|
" var titlebar = $(\n",
|
|
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
|
" 'ui-helper-clearfix\"/>');\n",
|
|
" var titletext = $(\n",
|
|
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
|
" 'text-align: center; padding: 3px;\"/>');\n",
|
|
" titlebar.append(titletext)\n",
|
|
" this.root.append(titlebar);\n",
|
|
" this.header = titletext[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_canvas = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var canvas_div = $('<div/>');\n",
|
|
"\n",
|
|
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
|
"\n",
|
|
" function canvas_keyboard_event(event) {\n",
|
|
" return fig.key_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
|
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
|
" this.canvas_div = canvas_div\n",
|
|
" this._canvas_extra_style(canvas_div)\n",
|
|
" this.root.append(canvas_div);\n",
|
|
"\n",
|
|
" var canvas = $('<canvas/>');\n",
|
|
" canvas.addClass('mpl-canvas');\n",
|
|
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
|
"\n",
|
|
" this.canvas = canvas[0];\n",
|
|
" this.context = canvas[0].getContext(\"2d\");\n",
|
|
"\n",
|
|
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
|
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
|
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
|
"\tthis.context.msBackingStorePixelRatio ||\n",
|
|
"\tthis.context.oBackingStorePixelRatio ||\n",
|
|
"\tthis.context.backingStorePixelRatio || 1;\n",
|
|
"\n",
|
|
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
|
"\n",
|
|
" var rubberband = $('<canvas/>');\n",
|
|
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
|
"\n",
|
|
" var pass_mouse_events = true;\n",
|
|
"\n",
|
|
" canvas_div.resizable({\n",
|
|
" start: function(event, ui) {\n",
|
|
" pass_mouse_events = false;\n",
|
|
" },\n",
|
|
" resize: function(event, ui) {\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" stop: function(event, ui) {\n",
|
|
" pass_mouse_events = true;\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" });\n",
|
|
"\n",
|
|
" function mouse_event_fn(event) {\n",
|
|
" if (pass_mouse_events)\n",
|
|
" return fig.mouse_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
|
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
|
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
|
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
|
"\n",
|
|
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
|
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
|
"\n",
|
|
" canvas_div.on(\"wheel\", function (event) {\n",
|
|
" event = event.originalEvent;\n",
|
|
" event['data'] = 'scroll'\n",
|
|
" if (event.deltaY < 0) {\n",
|
|
" event.step = 1;\n",
|
|
" } else {\n",
|
|
" event.step = -1;\n",
|
|
" }\n",
|
|
" mouse_event_fn(event);\n",
|
|
" });\n",
|
|
"\n",
|
|
" canvas_div.append(canvas);\n",
|
|
" canvas_div.append(rubberband);\n",
|
|
"\n",
|
|
" this.rubberband = rubberband;\n",
|
|
" this.rubberband_canvas = rubberband[0];\n",
|
|
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
|
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
|
"\n",
|
|
" this._resize_canvas = function(width, height) {\n",
|
|
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
|
" // canvas in synch.\n",
|
|
" canvas_div.css('width', width)\n",
|
|
" canvas_div.css('height', height)\n",
|
|
"\n",
|
|
" canvas.attr('width', width * mpl.ratio);\n",
|
|
" canvas.attr('height', height * mpl.ratio);\n",
|
|
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
|
"\n",
|
|
" rubberband.attr('width', width);\n",
|
|
" rubberband.attr('height', height);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
|
" // upon first draw.\n",
|
|
" this._resize_canvas(600, 600);\n",
|
|
"\n",
|
|
" // Disable right mouse context menu.\n",
|
|
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
|
" return false;\n",
|
|
" });\n",
|
|
"\n",
|
|
" function set_focus () {\n",
|
|
" canvas.focus();\n",
|
|
" canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" window.setTimeout(set_focus, 100);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>');\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) {\n",
|
|
" // put a spacer in here.\n",
|
|
" continue;\n",
|
|
" }\n",
|
|
" var button = $('<button/>');\n",
|
|
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
|
" 'ui-button-icon-only');\n",
|
|
" button.attr('role', 'button');\n",
|
|
" button.attr('aria-disabled', 'false');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
"\n",
|
|
" var icon_img = $('<span/>');\n",
|
|
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
|
" icon_img.addClass(image);\n",
|
|
" icon_img.addClass('ui-corner-all');\n",
|
|
"\n",
|
|
" var tooltip_span = $('<span/>');\n",
|
|
" tooltip_span.addClass('ui-button-text');\n",
|
|
" tooltip_span.html(tooltip);\n",
|
|
"\n",
|
|
" button.append(icon_img);\n",
|
|
" button.append(tooltip_span);\n",
|
|
"\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fmt_picker_span = $('<span/>');\n",
|
|
"\n",
|
|
" var fmt_picker = $('<select/>');\n",
|
|
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
|
" fmt_picker_span.append(fmt_picker);\n",
|
|
" nav_element.append(fmt_picker_span);\n",
|
|
" this.format_dropdown = fmt_picker[0];\n",
|
|
"\n",
|
|
" for (var ind in mpl.extensions) {\n",
|
|
" var fmt = mpl.extensions[ind];\n",
|
|
" var option = $(\n",
|
|
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
|
" fmt_picker.append(option);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add hover states to the ui-buttons\n",
|
|
" $( \".ui-button\" ).hover(\n",
|
|
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
|
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
|
" );\n",
|
|
"\n",
|
|
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
|
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
|
" // which will in turn request a refresh of the image.\n",
|
|
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
|
" properties['type'] = type;\n",
|
|
" properties['figure_id'] = this.id;\n",
|
|
" this.ws.send(JSON.stringify(properties));\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_draw_message = function() {\n",
|
|
" if (!this.waiting) {\n",
|
|
" this.waiting = true;\n",
|
|
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" var format_dropdown = fig.format_dropdown;\n",
|
|
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
|
" fig.ondownload(fig, format);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
|
" var size = msg['size'];\n",
|
|
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
|
" fig._resize_canvas(size[0], size[1]);\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
|
" var x0 = msg['x0'] / mpl.ratio;\n",
|
|
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
|
" var x1 = msg['x1'] / mpl.ratio;\n",
|
|
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
|
" x0 = Math.floor(x0) + 0.5;\n",
|
|
" y0 = Math.floor(y0) + 0.5;\n",
|
|
" x1 = Math.floor(x1) + 0.5;\n",
|
|
" y1 = Math.floor(y1) + 0.5;\n",
|
|
" var min_x = Math.min(x0, x1);\n",
|
|
" var min_y = Math.min(y0, y1);\n",
|
|
" var width = Math.abs(x1 - x0);\n",
|
|
" var height = Math.abs(y1 - y0);\n",
|
|
"\n",
|
|
" fig.rubberband_context.clearRect(\n",
|
|
" 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
|
|
"\n",
|
|
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
|
" // Updates the figure title.\n",
|
|
" fig.header.textContent = msg['label'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
|
" var cursor = msg['cursor'];\n",
|
|
" switch(cursor)\n",
|
|
" {\n",
|
|
" case 0:\n",
|
|
" cursor = 'pointer';\n",
|
|
" break;\n",
|
|
" case 1:\n",
|
|
" cursor = 'default';\n",
|
|
" break;\n",
|
|
" case 2:\n",
|
|
" cursor = 'crosshair';\n",
|
|
" break;\n",
|
|
" case 3:\n",
|
|
" cursor = 'move';\n",
|
|
" break;\n",
|
|
" }\n",
|
|
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
|
" fig.message.textContent = msg['message'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
|
" // Request the server to send over a new figure.\n",
|
|
" fig.send_draw_message();\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
|
" fig.image_mode = msg['mode'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Called whenever the canvas gets updated.\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"// A function to construct a web socket function for onmessage handling.\n",
|
|
"// Called in the figure constructor.\n",
|
|
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
|
" return function socket_on_message(evt) {\n",
|
|
" if (evt.data instanceof Blob) {\n",
|
|
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
|
" * transferred with MIME type text/plain:\" errors on\n",
|
|
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
|
" * to be part of the websocket stream */\n",
|
|
" evt.data.type = \"image/png\";\n",
|
|
"\n",
|
|
" /* Free the memory for the previous frames */\n",
|
|
" if (fig.imageObj.src) {\n",
|
|
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
|
" fig.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
|
" evt.data);\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
|
" fig.imageObj.src = evt.data;\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var msg = JSON.parse(evt.data);\n",
|
|
" var msg_type = msg['type'];\n",
|
|
"\n",
|
|
" // Call the \"handle_{type}\" callback, which takes\n",
|
|
" // the figure and JSON message as its only arguments.\n",
|
|
" try {\n",
|
|
" var callback = fig[\"handle_\" + msg_type];\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (callback) {\n",
|
|
" try {\n",
|
|
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
|
" callback(fig, msg);\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
|
" }\n",
|
|
" }\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
|
"mpl.findpos = function(e) {\n",
|
|
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
|
" var targ;\n",
|
|
" if (!e)\n",
|
|
" e = window.event;\n",
|
|
" if (e.target)\n",
|
|
" targ = e.target;\n",
|
|
" else if (e.srcElement)\n",
|
|
" targ = e.srcElement;\n",
|
|
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
|
" targ = targ.parentNode;\n",
|
|
"\n",
|
|
" // jQuery normalizes the pageX and pageY\n",
|
|
" // pageX,Y are the mouse positions relative to the document\n",
|
|
" // offset() returns the position of the element relative to the document\n",
|
|
" var x = e.pageX - $(targ).offset().left;\n",
|
|
" var y = e.pageY - $(targ).offset().top;\n",
|
|
"\n",
|
|
" return {\"x\": x, \"y\": y};\n",
|
|
"};\n",
|
|
"\n",
|
|
"/*\n",
|
|
" * return a copy of an object with only non-object keys\n",
|
|
" * we need this to avoid circular references\n",
|
|
" * http://stackoverflow.com/a/24161582/3208463\n",
|
|
" */\n",
|
|
"function simpleKeys (original) {\n",
|
|
" return Object.keys(original).reduce(function (obj, key) {\n",
|
|
" if (typeof original[key] !== 'object')\n",
|
|
" obj[key] = original[key]\n",
|
|
" return obj;\n",
|
|
" }, {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
|
" var canvas_pos = mpl.findpos(event)\n",
|
|
"\n",
|
|
" if (name === 'button_press')\n",
|
|
" {\n",
|
|
" this.canvas.focus();\n",
|
|
" this.canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" var x = canvas_pos.x * mpl.ratio;\n",
|
|
" var y = canvas_pos.y * mpl.ratio;\n",
|
|
"\n",
|
|
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
|
" step: event.step,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
"\n",
|
|
" /* This prevents the web browser from automatically changing to\n",
|
|
" * the text insertion cursor when the button is pressed. We want\n",
|
|
" * to control all of the cursor setting manually through the\n",
|
|
" * 'cursor' event from matplotlib */\n",
|
|
" event.preventDefault();\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" // Handle any extra behaviour associated with a key event\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
|
"\n",
|
|
" // Prevent repeat events\n",
|
|
" if (name == 'key_press')\n",
|
|
" {\n",
|
|
" if (event.which === this._key)\n",
|
|
" return;\n",
|
|
" else\n",
|
|
" this._key = event.which;\n",
|
|
" }\n",
|
|
" if (name == 'key_release')\n",
|
|
" this._key = null;\n",
|
|
"\n",
|
|
" var value = '';\n",
|
|
" if (event.ctrlKey && event.which != 17)\n",
|
|
" value += \"ctrl+\";\n",
|
|
" if (event.altKey && event.which != 18)\n",
|
|
" value += \"alt+\";\n",
|
|
" if (event.shiftKey && event.which != 16)\n",
|
|
" value += \"shift+\";\n",
|
|
"\n",
|
|
" value += 'k';\n",
|
|
" value += event.which.toString();\n",
|
|
"\n",
|
|
" this._key_event_extra(event, name);\n",
|
|
"\n",
|
|
" this.send_message(name, {key: value,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
|
" if (name == 'download') {\n",
|
|
" this.handle_save(this, null);\n",
|
|
" } else {\n",
|
|
" this.send_message(\"toolbar_button\", {name: name});\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
|
" this.message.textContent = tooltip;\n",
|
|
"};\n",
|
|
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
|
"\n",
|
|
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
|
"\n",
|
|
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
|
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
|
" // object with the appropriate methods. Currently this is a non binary\n",
|
|
" // socket, so there is still some room for performance tuning.\n",
|
|
" var ws = {};\n",
|
|
"\n",
|
|
" ws.close = function() {\n",
|
|
" comm.close()\n",
|
|
" };\n",
|
|
" ws.send = function(m) {\n",
|
|
" //console.log('sending', m);\n",
|
|
" comm.send(m);\n",
|
|
" };\n",
|
|
" // Register the callback with on_msg.\n",
|
|
" comm.on_msg(function(msg) {\n",
|
|
" //console.log('receiving', msg['content']['data'], msg);\n",
|
|
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
|
|
" ws.onmessage(msg['content']['data'])\n",
|
|
" });\n",
|
|
" return ws;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
|
" // This is the function which gets called when the mpl process\n",
|
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
|
"\n",
|
|
" var id = msg.content.data.id;\n",
|
|
" // Get hold of the div created by the display call when the Comm\n",
|
|
" // socket was opened in Python.\n",
|
|
" var element = $(\"#\" + id);\n",
|
|
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
|
"\n",
|
|
" function ondownload(figure, format) {\n",
|
|
" window.open(figure.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fig = new mpl.figure(id, ws_proxy,\n",
|
|
" ondownload,\n",
|
|
" element.get(0));\n",
|
|
"\n",
|
|
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
|
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
|
" ws_proxy.onopen();\n",
|
|
"\n",
|
|
" fig.parent_element = element.get(0);\n",
|
|
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
|
" if (!fig.cell_info) {\n",
|
|
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var output_index = fig.cell_info[2]\n",
|
|
" var cell = fig.cell_info[0];\n",
|
|
"\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
|
" var width = fig.canvas.width/mpl.ratio\n",
|
|
" fig.root.unbind('remove')\n",
|
|
"\n",
|
|
" // Update the output cell to use the data from the current canvas.\n",
|
|
" fig.push_to_output();\n",
|
|
" var dataURL = fig.canvas.toDataURL();\n",
|
|
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
|
" // the notebook keyboard shortcuts fail.\n",
|
|
" IPython.keyboard_manager.enable()\n",
|
|
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
|
" fig.close_ws(fig, msg);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
|
" fig.send_message('closing', msg);\n",
|
|
" // fig.ws.close()\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
|
" // Turn the data on the canvas into data in the output cell.\n",
|
|
" var width = this.canvas.width/mpl.ratio\n",
|
|
" var dataURL = this.canvas.toDataURL();\n",
|
|
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Tell IPython that the notebook contents must change.\n",
|
|
" IPython.notebook.set_dirty(true);\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
" var fig = this;\n",
|
|
" // Wait a second, then push the new image to the DOM so\n",
|
|
" // that it is saved nicely (might be nice to debounce this).\n",
|
|
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>');\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) { continue; };\n",
|
|
"\n",
|
|
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add the status bar.\n",
|
|
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"\n",
|
|
" // Add the close button to the window.\n",
|
|
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
|
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
|
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
|
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
|
" buttongrp.append(button);\n",
|
|
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
|
" titlebar.prepend(buttongrp);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
|
" var fig = this\n",
|
|
" el.on(\"remove\", function(){\n",
|
|
"\tfig.close_ws(fig, {});\n",
|
|
" });\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
|
" // this is important to make the div 'focusable\n",
|
|
" el.attr('tabindex', 0)\n",
|
|
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
|
" // off when our div gets focus\n",
|
|
"\n",
|
|
" // location in version 3\n",
|
|
" if (IPython.notebook.keyboard_manager) {\n",
|
|
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
" else {\n",
|
|
" // location in version 2\n",
|
|
" IPython.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" var manager = IPython.notebook.keyboard_manager;\n",
|
|
" if (!manager)\n",
|
|
" manager = IPython.keyboard_manager;\n",
|
|
"\n",
|
|
" // Check for shift+enter\n",
|
|
" if (event.shiftKey && event.which == 13) {\n",
|
|
" this.canvas_div.blur();\n",
|
|
" // select the cell after this one\n",
|
|
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
|
|
" IPython.notebook.select(index + 1);\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" fig.ondownload(fig, null);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.find_output_cell = function(html_output) {\n",
|
|
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
|
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
|
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
|
" // our purposes (turning an active figure into a static one), is too late.\n",
|
|
" var cells = IPython.notebook.get_cells();\n",
|
|
" var ncells = cells.length;\n",
|
|
" for (var i=0; i<ncells; i++) {\n",
|
|
" var cell = cells[i];\n",
|
|
" if (cell.cell_type === 'code'){\n",
|
|
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
|
" var data = cell.output_area.outputs[j];\n",
|
|
" if (data.data) {\n",
|
|
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
|
" data = data.data;\n",
|
|
" }\n",
|
|
" if (data['text/html'] == html_output) {\n",
|
|
" return [cell, data, j];\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"// Register the function which deals with the matplotlib target/channel.\n",
|
|
"// The kernel may be null if the page has been refreshed.\n",
|
|
"if (IPython.notebook.kernel != null) {\n",
|
|
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
|
"}\n"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.Javascript object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<img src=\"data:image/png;base64,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\" width=\"640\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"\n",
|
|
"Temps d'execution de fibor avec n=39 : 24.927656882000008\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Copiez ici le code de la fonction fibor\n",
|
|
"\n",
|
|
"# Mesure du temps et tracés\n",
|
|
"import time\n",
|
|
"%matplotlib notebook\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"n = [i for i in range(5, 40, 2)]\n",
|
|
"liste_temps = []\n",
|
|
"\n",
|
|
"for i in n:\n",
|
|
" print(f\"Test avec n={i}\", end = \" - \")\n",
|
|
" temps = 0.0\n",
|
|
" nb_loops = 3\n",
|
|
" for test in range(nb_loops):\n",
|
|
" start = time.process_time()\n",
|
|
" fibor(i)\n",
|
|
" temps += time.process_time() - start\n",
|
|
" temps /= nb_loops\n",
|
|
" liste_temps.append(temps)\n",
|
|
"\n",
|
|
"plt.plot(n, liste_temps, label=\"fibor\")\n",
|
|
"plt.xlabel(\"n\")\n",
|
|
"plt.grid(True)\n",
|
|
"print(f\"\\n\\nTemps d'execution de fibor avec n={n[-1]} : {liste_temps[-1]}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Comme prévu, le temps d'exécution est bien **exponentiel** en fonction du nombre n. Cet algorithme **récursif** est très **esthétique** dans son écriture mais c'est une **catastrophe en terme de performance** : 25 sec pour n = 39 seulement !\n",
|
|
"\n",
|
|
"- **Copier-coller** la définition de votre fonction `fibordyn` au début de la cellule suivante et exécutez la cellule pour analyser les performances."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Test avec n=10 - Test avec n=35 - Test avec n=60 - Test avec n=85 - Test avec n=110 - Test avec n=135 - Test avec n=160 - Test avec n=185 - Test avec n=210 - Test avec n=235 - Test avec n=260 - Test avec n=285 - Test avec n=310 - Test avec n=335 - Test avec n=360 - Test avec n=385 - Test avec n=410 - Test avec n=435 - Test avec n=460 - Test avec n=485 - Test avec n=510 - Test avec n=535 - Test avec n=560 - Test avec n=585 - Test avec n=610 - Test avec n=635 - Test avec n=660 - Test avec n=685 - Test avec n=710 - Test avec n=735 - Test avec n=760 - Test avec n=785 - Test avec n=810 - Test avec n=835 - Test avec n=860 - Test avec n=885 - Test avec n=910 - Test avec n=935 - Test avec n=960 - Test avec n=985 - Test avec n=1010 - Test avec n=1035 - Test avec n=1060 - Test avec n=1085 - Test avec n=1110 - Test avec n=1135 - Test avec n=1160 - Test avec n=1185 - Test avec n=1210 - Test avec n=1235 - Test avec n=1260 - Test avec n=1285 - Test avec n=1310 - Test avec n=1335 - Test avec n=1360 - Test avec n=1385 - Test avec n=1410 - Test avec n=1435 - Test avec n=1460 - Test avec n=1485 - Test avec n=1510 - Test avec n=1535 - Test avec n=1560 - Test avec n=1585 - Test avec n=1610 - Test avec n=1635 - Test avec n=1660 - Test avec n=1685 - Test avec n=1710 - Test avec n=1735 - Test avec n=1760 - Test avec n=1785 - Test avec n=1810 - Test avec n=1835 - Test avec n=1860 - Test avec n=1885 - Test avec n=1910 - Test avec n=1935 - Test avec n=1960 - Test avec n=1985 - Test avec n=2010 - Test avec n=2035 - Test avec n=2060 - Test avec n=2085 - Test avec n=2110 - Test avec n=2135 - Test avec n=2160 - Test avec n=2185 - Test avec n=2210 - Test avec n=2235 - Test avec n=2260 - Test avec n=2285 - Test avec n=2310 - Test avec n=2335 - Test avec n=2360 - Test avec n=2385 - Test avec n=2410 - Test avec n=2435 - Test avec n=2460 - Test avec n=2485 - Test avec n=2510 - Test avec n=2535 - Test avec n=2560 - Test avec n=2585 - Test avec n=2610 - Test avec n=2635 - Test avec n=2660 - Test avec n=2685 - Test avec n=2710 - Test avec n=2735 - Test avec n=2760 - Test avec n=2785 - Test avec n=2810 - Test avec n=2835 - Test avec n=2860 - Test avec n=2885 - Test avec n=2910 - Test avec n=2935 - Test avec n=2960 - "
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"application/javascript": [
|
|
"/* Put everything inside the global mpl namespace */\n",
|
|
"window.mpl = {};\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.get_websocket_type = function() {\n",
|
|
" if (typeof(WebSocket) !== 'undefined') {\n",
|
|
" return WebSocket;\n",
|
|
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
|
" return MozWebSocket;\n",
|
|
" } else {\n",
|
|
" alert('Your browser does not have WebSocket support. ' +\n",
|
|
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
|
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
|
" 'have to enable WebSockets in about:config.');\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
|
" this.id = figure_id;\n",
|
|
"\n",
|
|
" this.ws = websocket;\n",
|
|
"\n",
|
|
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
|
"\n",
|
|
" if (!this.supports_binary) {\n",
|
|
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
|
" if (warnings) {\n",
|
|
" warnings.style.display = 'block';\n",
|
|
" warnings.textContent = (\n",
|
|
" \"This browser does not support binary websocket messages. \" +\n",
|
|
" \"Performance may be slow.\");\n",
|
|
" }\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj = new Image();\n",
|
|
"\n",
|
|
" this.context = undefined;\n",
|
|
" this.message = undefined;\n",
|
|
" this.canvas = undefined;\n",
|
|
" this.rubberband_canvas = undefined;\n",
|
|
" this.rubberband_context = undefined;\n",
|
|
" this.format_dropdown = undefined;\n",
|
|
"\n",
|
|
" this.image_mode = 'full';\n",
|
|
"\n",
|
|
" this.root = $('<div/>');\n",
|
|
" this._root_extra_style(this.root)\n",
|
|
" this.root.attr('style', 'display: inline-block');\n",
|
|
"\n",
|
|
" $(parent_element).append(this.root);\n",
|
|
"\n",
|
|
" this._init_header(this);\n",
|
|
" this._init_canvas(this);\n",
|
|
" this._init_toolbar(this);\n",
|
|
"\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" this.waiting = false;\n",
|
|
"\n",
|
|
" this.ws.onopen = function () {\n",
|
|
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
|
" fig.send_message(\"send_image_mode\", {});\n",
|
|
" if (mpl.ratio != 1) {\n",
|
|
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
|
" }\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.imageObj.onload = function() {\n",
|
|
" if (fig.image_mode == 'full') {\n",
|
|
" // Full images could contain transparency (where diff images\n",
|
|
" // almost always do), so we need to clear the canvas so that\n",
|
|
" // there is no ghosting.\n",
|
|
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
|
" }\n",
|
|
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
|
" };\n",
|
|
"\n",
|
|
" this.imageObj.onunload = function() {\n",
|
|
" fig.ws.close();\n",
|
|
" }\n",
|
|
"\n",
|
|
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
|
"\n",
|
|
" this.ondownload = ondownload;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_header = function() {\n",
|
|
" var titlebar = $(\n",
|
|
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
|
" 'ui-helper-clearfix\"/>');\n",
|
|
" var titletext = $(\n",
|
|
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
|
" 'text-align: center; padding: 3px;\"/>');\n",
|
|
" titlebar.append(titletext)\n",
|
|
" this.root.append(titlebar);\n",
|
|
" this.header = titletext[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_canvas = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var canvas_div = $('<div/>');\n",
|
|
"\n",
|
|
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
|
"\n",
|
|
" function canvas_keyboard_event(event) {\n",
|
|
" return fig.key_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
|
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
|
" this.canvas_div = canvas_div\n",
|
|
" this._canvas_extra_style(canvas_div)\n",
|
|
" this.root.append(canvas_div);\n",
|
|
"\n",
|
|
" var canvas = $('<canvas/>');\n",
|
|
" canvas.addClass('mpl-canvas');\n",
|
|
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
|
"\n",
|
|
" this.canvas = canvas[0];\n",
|
|
" this.context = canvas[0].getContext(\"2d\");\n",
|
|
"\n",
|
|
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
|
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
|
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
|
"\tthis.context.msBackingStorePixelRatio ||\n",
|
|
"\tthis.context.oBackingStorePixelRatio ||\n",
|
|
"\tthis.context.backingStorePixelRatio || 1;\n",
|
|
"\n",
|
|
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
|
"\n",
|
|
" var rubberband = $('<canvas/>');\n",
|
|
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
|
"\n",
|
|
" var pass_mouse_events = true;\n",
|
|
"\n",
|
|
" canvas_div.resizable({\n",
|
|
" start: function(event, ui) {\n",
|
|
" pass_mouse_events = false;\n",
|
|
" },\n",
|
|
" resize: function(event, ui) {\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" stop: function(event, ui) {\n",
|
|
" pass_mouse_events = true;\n",
|
|
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
|
" },\n",
|
|
" });\n",
|
|
"\n",
|
|
" function mouse_event_fn(event) {\n",
|
|
" if (pass_mouse_events)\n",
|
|
" return fig.mouse_event(event, event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
|
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
|
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
|
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
|
"\n",
|
|
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
|
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
|
"\n",
|
|
" canvas_div.on(\"wheel\", function (event) {\n",
|
|
" event = event.originalEvent;\n",
|
|
" event['data'] = 'scroll'\n",
|
|
" if (event.deltaY < 0) {\n",
|
|
" event.step = 1;\n",
|
|
" } else {\n",
|
|
" event.step = -1;\n",
|
|
" }\n",
|
|
" mouse_event_fn(event);\n",
|
|
" });\n",
|
|
"\n",
|
|
" canvas_div.append(canvas);\n",
|
|
" canvas_div.append(rubberband);\n",
|
|
"\n",
|
|
" this.rubberband = rubberband;\n",
|
|
" this.rubberband_canvas = rubberband[0];\n",
|
|
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
|
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
|
"\n",
|
|
" this._resize_canvas = function(width, height) {\n",
|
|
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
|
" // canvas in synch.\n",
|
|
" canvas_div.css('width', width)\n",
|
|
" canvas_div.css('height', height)\n",
|
|
"\n",
|
|
" canvas.attr('width', width * mpl.ratio);\n",
|
|
" canvas.attr('height', height * mpl.ratio);\n",
|
|
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
|
"\n",
|
|
" rubberband.attr('width', width);\n",
|
|
" rubberband.attr('height', height);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
|
" // upon first draw.\n",
|
|
" this._resize_canvas(600, 600);\n",
|
|
"\n",
|
|
" // Disable right mouse context menu.\n",
|
|
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
|
" return false;\n",
|
|
" });\n",
|
|
"\n",
|
|
" function set_focus () {\n",
|
|
" canvas.focus();\n",
|
|
" canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" window.setTimeout(set_focus, 100);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>');\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) {\n",
|
|
" // put a spacer in here.\n",
|
|
" continue;\n",
|
|
" }\n",
|
|
" var button = $('<button/>');\n",
|
|
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
|
" 'ui-button-icon-only');\n",
|
|
" button.attr('role', 'button');\n",
|
|
" button.attr('aria-disabled', 'false');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
"\n",
|
|
" var icon_img = $('<span/>');\n",
|
|
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
|
" icon_img.addClass(image);\n",
|
|
" icon_img.addClass('ui-corner-all');\n",
|
|
"\n",
|
|
" var tooltip_span = $('<span/>');\n",
|
|
" tooltip_span.addClass('ui-button-text');\n",
|
|
" tooltip_span.html(tooltip);\n",
|
|
"\n",
|
|
" button.append(icon_img);\n",
|
|
" button.append(tooltip_span);\n",
|
|
"\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fmt_picker_span = $('<span/>');\n",
|
|
"\n",
|
|
" var fmt_picker = $('<select/>');\n",
|
|
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
|
" fmt_picker_span.append(fmt_picker);\n",
|
|
" nav_element.append(fmt_picker_span);\n",
|
|
" this.format_dropdown = fmt_picker[0];\n",
|
|
"\n",
|
|
" for (var ind in mpl.extensions) {\n",
|
|
" var fmt = mpl.extensions[ind];\n",
|
|
" var option = $(\n",
|
|
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
|
" fmt_picker.append(option);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add hover states to the ui-buttons\n",
|
|
" $( \".ui-button\" ).hover(\n",
|
|
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
|
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
|
" );\n",
|
|
"\n",
|
|
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
|
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
|
" // which will in turn request a refresh of the image.\n",
|
|
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
|
" properties['type'] = type;\n",
|
|
" properties['figure_id'] = this.id;\n",
|
|
" this.ws.send(JSON.stringify(properties));\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.send_draw_message = function() {\n",
|
|
" if (!this.waiting) {\n",
|
|
" this.waiting = true;\n",
|
|
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" var format_dropdown = fig.format_dropdown;\n",
|
|
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
|
" fig.ondownload(fig, format);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
|
" var size = msg['size'];\n",
|
|
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
|
" fig._resize_canvas(size[0], size[1]);\n",
|
|
" fig.send_message(\"refresh\", {});\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
|
" var x0 = msg['x0'] / mpl.ratio;\n",
|
|
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
|
" var x1 = msg['x1'] / mpl.ratio;\n",
|
|
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
|
" x0 = Math.floor(x0) + 0.5;\n",
|
|
" y0 = Math.floor(y0) + 0.5;\n",
|
|
" x1 = Math.floor(x1) + 0.5;\n",
|
|
" y1 = Math.floor(y1) + 0.5;\n",
|
|
" var min_x = Math.min(x0, x1);\n",
|
|
" var min_y = Math.min(y0, y1);\n",
|
|
" var width = Math.abs(x1 - x0);\n",
|
|
" var height = Math.abs(y1 - y0);\n",
|
|
"\n",
|
|
" fig.rubberband_context.clearRect(\n",
|
|
" 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
|
|
"\n",
|
|
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
|
" // Updates the figure title.\n",
|
|
" fig.header.textContent = msg['label'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
|
" var cursor = msg['cursor'];\n",
|
|
" switch(cursor)\n",
|
|
" {\n",
|
|
" case 0:\n",
|
|
" cursor = 'pointer';\n",
|
|
" break;\n",
|
|
" case 1:\n",
|
|
" cursor = 'default';\n",
|
|
" break;\n",
|
|
" case 2:\n",
|
|
" cursor = 'crosshair';\n",
|
|
" break;\n",
|
|
" case 3:\n",
|
|
" cursor = 'move';\n",
|
|
" break;\n",
|
|
" }\n",
|
|
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
|
" fig.message.textContent = msg['message'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
|
" // Request the server to send over a new figure.\n",
|
|
" fig.send_draw_message();\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
|
" fig.image_mode = msg['mode'];\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Called whenever the canvas gets updated.\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"// A function to construct a web socket function for onmessage handling.\n",
|
|
"// Called in the figure constructor.\n",
|
|
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
|
" return function socket_on_message(evt) {\n",
|
|
" if (evt.data instanceof Blob) {\n",
|
|
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
|
" * transferred with MIME type text/plain:\" errors on\n",
|
|
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
|
" * to be part of the websocket stream */\n",
|
|
" evt.data.type = \"image/png\";\n",
|
|
"\n",
|
|
" /* Free the memory for the previous frames */\n",
|
|
" if (fig.imageObj.src) {\n",
|
|
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
|
" fig.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
|
" evt.data);\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
|
" fig.imageObj.src = evt.data;\n",
|
|
" fig.updated_canvas_event();\n",
|
|
" fig.waiting = false;\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var msg = JSON.parse(evt.data);\n",
|
|
" var msg_type = msg['type'];\n",
|
|
"\n",
|
|
" // Call the \"handle_{type}\" callback, which takes\n",
|
|
" // the figure and JSON message as its only arguments.\n",
|
|
" try {\n",
|
|
" var callback = fig[\"handle_\" + msg_type];\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" if (callback) {\n",
|
|
" try {\n",
|
|
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
|
" callback(fig, msg);\n",
|
|
" } catch (e) {\n",
|
|
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
|
" }\n",
|
|
" }\n",
|
|
" };\n",
|
|
"}\n",
|
|
"\n",
|
|
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
|
"mpl.findpos = function(e) {\n",
|
|
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
|
" var targ;\n",
|
|
" if (!e)\n",
|
|
" e = window.event;\n",
|
|
" if (e.target)\n",
|
|
" targ = e.target;\n",
|
|
" else if (e.srcElement)\n",
|
|
" targ = e.srcElement;\n",
|
|
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
|
" targ = targ.parentNode;\n",
|
|
"\n",
|
|
" // jQuery normalizes the pageX and pageY\n",
|
|
" // pageX,Y are the mouse positions relative to the document\n",
|
|
" // offset() returns the position of the element relative to the document\n",
|
|
" var x = e.pageX - $(targ).offset().left;\n",
|
|
" var y = e.pageY - $(targ).offset().top;\n",
|
|
"\n",
|
|
" return {\"x\": x, \"y\": y};\n",
|
|
"};\n",
|
|
"\n",
|
|
"/*\n",
|
|
" * return a copy of an object with only non-object keys\n",
|
|
" * we need this to avoid circular references\n",
|
|
" * http://stackoverflow.com/a/24161582/3208463\n",
|
|
" */\n",
|
|
"function simpleKeys (original) {\n",
|
|
" return Object.keys(original).reduce(function (obj, key) {\n",
|
|
" if (typeof original[key] !== 'object')\n",
|
|
" obj[key] = original[key]\n",
|
|
" return obj;\n",
|
|
" }, {});\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
|
" var canvas_pos = mpl.findpos(event)\n",
|
|
"\n",
|
|
" if (name === 'button_press')\n",
|
|
" {\n",
|
|
" this.canvas.focus();\n",
|
|
" this.canvas_div.focus();\n",
|
|
" }\n",
|
|
"\n",
|
|
" var x = canvas_pos.x * mpl.ratio;\n",
|
|
" var y = canvas_pos.y * mpl.ratio;\n",
|
|
"\n",
|
|
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
|
" step: event.step,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
"\n",
|
|
" /* This prevents the web browser from automatically changing to\n",
|
|
" * the text insertion cursor when the button is pressed. We want\n",
|
|
" * to control all of the cursor setting manually through the\n",
|
|
" * 'cursor' event from matplotlib */\n",
|
|
" event.preventDefault();\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" // Handle any extra behaviour associated with a key event\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
|
"\n",
|
|
" // Prevent repeat events\n",
|
|
" if (name == 'key_press')\n",
|
|
" {\n",
|
|
" if (event.which === this._key)\n",
|
|
" return;\n",
|
|
" else\n",
|
|
" this._key = event.which;\n",
|
|
" }\n",
|
|
" if (name == 'key_release')\n",
|
|
" this._key = null;\n",
|
|
"\n",
|
|
" var value = '';\n",
|
|
" if (event.ctrlKey && event.which != 17)\n",
|
|
" value += \"ctrl+\";\n",
|
|
" if (event.altKey && event.which != 18)\n",
|
|
" value += \"alt+\";\n",
|
|
" if (event.shiftKey && event.which != 16)\n",
|
|
" value += \"shift+\";\n",
|
|
"\n",
|
|
" value += 'k';\n",
|
|
" value += event.which.toString();\n",
|
|
"\n",
|
|
" this._key_event_extra(event, name);\n",
|
|
"\n",
|
|
" this.send_message(name, {key: value,\n",
|
|
" guiEvent: simpleKeys(event)});\n",
|
|
" return false;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
|
" if (name == 'download') {\n",
|
|
" this.handle_save(this, null);\n",
|
|
" } else {\n",
|
|
" this.send_message(\"toolbar_button\", {name: name});\n",
|
|
" }\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
|
" this.message.textContent = tooltip;\n",
|
|
"};\n",
|
|
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
|
"\n",
|
|
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
|
"\n",
|
|
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
|
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
|
" // object with the appropriate methods. Currently this is a non binary\n",
|
|
" // socket, so there is still some room for performance tuning.\n",
|
|
" var ws = {};\n",
|
|
"\n",
|
|
" ws.close = function() {\n",
|
|
" comm.close()\n",
|
|
" };\n",
|
|
" ws.send = function(m) {\n",
|
|
" //console.log('sending', m);\n",
|
|
" comm.send(m);\n",
|
|
" };\n",
|
|
" // Register the callback with on_msg.\n",
|
|
" comm.on_msg(function(msg) {\n",
|
|
" //console.log('receiving', msg['content']['data'], msg);\n",
|
|
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
|
|
" ws.onmessage(msg['content']['data'])\n",
|
|
" });\n",
|
|
" return ws;\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
|
" // This is the function which gets called when the mpl process\n",
|
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
|
"\n",
|
|
" var id = msg.content.data.id;\n",
|
|
" // Get hold of the div created by the display call when the Comm\n",
|
|
" // socket was opened in Python.\n",
|
|
" var element = $(\"#\" + id);\n",
|
|
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
|
"\n",
|
|
" function ondownload(figure, format) {\n",
|
|
" window.open(figure.imageObj.src);\n",
|
|
" }\n",
|
|
"\n",
|
|
" var fig = new mpl.figure(id, ws_proxy,\n",
|
|
" ondownload,\n",
|
|
" element.get(0));\n",
|
|
"\n",
|
|
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
|
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
|
" ws_proxy.onopen();\n",
|
|
"\n",
|
|
" fig.parent_element = element.get(0);\n",
|
|
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
|
" if (!fig.cell_info) {\n",
|
|
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
|
" return;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var output_index = fig.cell_info[2]\n",
|
|
" var cell = fig.cell_info[0];\n",
|
|
"\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
|
" var width = fig.canvas.width/mpl.ratio\n",
|
|
" fig.root.unbind('remove')\n",
|
|
"\n",
|
|
" // Update the output cell to use the data from the current canvas.\n",
|
|
" fig.push_to_output();\n",
|
|
" var dataURL = fig.canvas.toDataURL();\n",
|
|
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
|
" // the notebook keyboard shortcuts fail.\n",
|
|
" IPython.keyboard_manager.enable()\n",
|
|
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
|
" fig.close_ws(fig, msg);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
|
" fig.send_message('closing', msg);\n",
|
|
" // fig.ws.close()\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
|
" // Turn the data on the canvas into data in the output cell.\n",
|
|
" var width = this.canvas.width/mpl.ratio\n",
|
|
" var dataURL = this.canvas.toDataURL();\n",
|
|
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
|
" // Tell IPython that the notebook contents must change.\n",
|
|
" IPython.notebook.set_dirty(true);\n",
|
|
" this.send_message(\"ack\", {});\n",
|
|
" var fig = this;\n",
|
|
" // Wait a second, then push the new image to the DOM so\n",
|
|
" // that it is saved nicely (might be nice to debounce this).\n",
|
|
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._init_toolbar = function() {\n",
|
|
" var fig = this;\n",
|
|
"\n",
|
|
" var nav_element = $('<div/>');\n",
|
|
" nav_element.attr('style', 'width: 100%');\n",
|
|
" this.root.append(nav_element);\n",
|
|
"\n",
|
|
" // Define a callback function for later on.\n",
|
|
" function toolbar_event(event) {\n",
|
|
" return fig.toolbar_button_onclick(event['data']);\n",
|
|
" }\n",
|
|
" function toolbar_mouse_event(event) {\n",
|
|
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
|
" }\n",
|
|
"\n",
|
|
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
|
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
|
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
|
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
|
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
|
"\n",
|
|
" if (!name) { continue; };\n",
|
|
"\n",
|
|
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
|
" button.click(method_name, toolbar_event);\n",
|
|
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
|
" nav_element.append(button);\n",
|
|
" }\n",
|
|
"\n",
|
|
" // Add the status bar.\n",
|
|
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
|
" nav_element.append(status_bar);\n",
|
|
" this.message = status_bar[0];\n",
|
|
"\n",
|
|
" // Add the close button to the window.\n",
|
|
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
|
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
|
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
|
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
|
" buttongrp.append(button);\n",
|
|
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
|
" titlebar.prepend(buttongrp);\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
|
" var fig = this\n",
|
|
" el.on(\"remove\", function(){\n",
|
|
"\tfig.close_ws(fig, {});\n",
|
|
" });\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
|
" // this is important to make the div 'focusable\n",
|
|
" el.attr('tabindex', 0)\n",
|
|
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
|
" // off when our div gets focus\n",
|
|
"\n",
|
|
" // location in version 3\n",
|
|
" if (IPython.notebook.keyboard_manager) {\n",
|
|
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
" else {\n",
|
|
" // location in version 2\n",
|
|
" IPython.keyboard_manager.register_events(el);\n",
|
|
" }\n",
|
|
"\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
|
" var manager = IPython.notebook.keyboard_manager;\n",
|
|
" if (!manager)\n",
|
|
" manager = IPython.keyboard_manager;\n",
|
|
"\n",
|
|
" // Check for shift+enter\n",
|
|
" if (event.shiftKey && event.which == 13) {\n",
|
|
" this.canvas_div.blur();\n",
|
|
" // select the cell after this one\n",
|
|
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
|
|
" IPython.notebook.select(index + 1);\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
|
" fig.ondownload(fig, null);\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"mpl.find_output_cell = function(html_output) {\n",
|
|
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
|
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
|
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
|
" // our purposes (turning an active figure into a static one), is too late.\n",
|
|
" var cells = IPython.notebook.get_cells();\n",
|
|
" var ncells = cells.length;\n",
|
|
" for (var i=0; i<ncells; i++) {\n",
|
|
" var cell = cells[i];\n",
|
|
" if (cell.cell_type === 'code'){\n",
|
|
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
|
" var data = cell.output_area.outputs[j];\n",
|
|
" if (data.data) {\n",
|
|
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
|
" data = data.data;\n",
|
|
" }\n",
|
|
" if (data['text/html'] == html_output) {\n",
|
|
" return [cell, data, j];\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"// Register the function which deals with the matplotlib target/channel.\n",
|
|
"// The kernel may be null if the page has been refreshed.\n",
|
|
"if (IPython.notebook.kernel != null) {\n",
|
|
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
|
"}\n"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.Javascript object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<img src=\"data:image/png;base64,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IsPlaWlp6NevX4DuVeBs2bIF69evR1lZGbZt2waHw4EePXqgrq4ORUVF0DQNNTU1hn8zffp0jBkzBgCwdu1ahIaGtvm+o0ePxowZM/zyGPzp+kHjrUZpaWmIiYlpc52YmBikp6d78yH4lacBuG7dOuTl5aG8vBwbN27EkCFDMGDAAP2vDFi5l9vtxrhx4zB8+HD9Mp5j7fPUC+A55klZWRnCw8MREhICu92OzZs3A+D55S8cgCbQOgCLi4sNly9duhT9+/cP0L0yj4aGBvTo0QPvvvuu/sRQW1truM60adOQmJgIoP0nhlGjRmHmzJl+uc/+1N4AVG3U3v8BefDBB/H222978yH4lacBeL3a2lrYbDbk5OQAsHav2bNnIyoqyvDiep5j7fPUyxOeY1d++3Xo0CHs2bMHqampuO+++1BZWcnzy084AE2AvwK+uVGjRiElJYW7z+guAAADzUlEQVS/AvaAvwKW6cgABK78j0Tra5Cs2mvOnDno06cPjhw5Yric55hn7fVqD88xo5EjR2LGjBk8v/yEA9Akhg4dilmzZhkui4uLs+SbQK7ncrnQu3dvvPHGG/qLg5ctW6Z/vampyeOLgz/77DP9OrW1tZZ7E4hqo9YXUO/evVu/TklJSdC/gLojA7Curg5hYWFYs2YNAOv1crvdePHFF9GrVy8cPHjQ49d5jl11s16eWP0c82TEiBFITk7m+eUnHIAm0foxMFlZWaiqqsL8+fMRHh6OY8eOBfqu+d2CBQuQn5+PI0eOoKSkBGPHjkVERITeIiMjA3a7Hbm5uSgvL8ekSZM8fjxAnz598M0336C0tBQjRozoVB8Dc/78eezduxd79+6FpmnIzMzE3r179Y8N8lajpKQkDB48GLt27cKuXbswaNCgoPwIhRv1On/+PBYsWIDi4mIcPXoUO3fuxGOPPYbevXtbttesWbNgt9uRn59v+NiSixcv6tfhOXbVzXrxHGvrtddeQ2FhIY4ePYqysjIsWrQIt99+O77++msAPL/8gQPQRJYvX46oqCiEhoYiPj7e8BECVtL6eU82mw29evXC008/jcrKSv3rrR8Q2rNnT4SFhSEhIcHwbjsAaGxsxJw5c3DPPffgrrvuwtixY/HTTz/5+6H4zM6dO9t8qKymaUhOTgbgvUanT5/G5MmT9Q9rnTx5clB+iOqNel28eBFjxoxB9+7dYbPZ0LdvXyQnJ7dpYaVenlppmobVq1fr1+E5dtXNevEca+uFF17Q//eue/fuGDlypD7+AJ5f/sABSERERGQxHIBEREREFsMBSERERGQxHIBEREREFsMBSERERGQxHIBEREREFsMBSERERGQxHIBEREREFsMBSERERGQxHIBEREREFsMBSERERGQxHIBERNdwOBx46aWX8Morr6Bbt27o0aMHnE5noO8WEZFXcQASEV3D4XCga9euWLJkCQ4ePIg1a9bgtttuM/yheiKiYMcBSER0DYfDgeHDhxsue+SRR7Bw4cIA3SMiIu/jACQiuobD4cDs2bMNl40fPx7PP/98gO4REZH3cQASEV3D4XBg3rx5hssmTJiA5OTkwNwhIiIf4AAkIroGByARWQEHIBHRNTgAicgKOACJiK7BAUhEVsABSERERGQxHIBEREREFsMBSERERGQxHIBEREREFsMBSERERGQxHIBEREREFsMBSERERGQxHIBEREREFsMBSERERGQxHIBEREREFsMBSERERGQxHIBEREREFsMBSERERGQx/w83Ve5n1eFLNAAAAABJRU5ErkJggg==\" width=\"640\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"\n",
|
|
"Temps d'execution de fibor avec n=2960 : 0.0013239043599969592\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Copiez ici le code de la fonction fibordyn\n",
|
|
"\n",
|
|
"# Mesure du temps et tracés\n",
|
|
"import time\n",
|
|
"%matplotlib notebook\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"n = [i for i in range(10, 2985, 25)]\n",
|
|
"liste_temps = []\n",
|
|
"\n",
|
|
"for i in n:\n",
|
|
" print(f\"Test avec n={i}\", end = \" - \")\n",
|
|
" temps = 0.0\n",
|
|
" nb_loops = 50\n",
|
|
" for test in range(nb_loops):\n",
|
|
" start = time.process_time()\n",
|
|
" fibordyn(i)\n",
|
|
" temps += time.process_time() - start\n",
|
|
" temps /= nb_loops\n",
|
|
" liste_temps.append(temps)\n",
|
|
"\n",
|
|
"plt.plot(n, liste_temps, label=\"fibor\")\n",
|
|
"plt.xlabel(\"n\")\n",
|
|
"plt.grid(True)\n",
|
|
"print(f\"\\n\\nTemps d'execution de fibor avec n={n[-1]} : {liste_temps[-1]}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Ici le temps d'exécution est bien **linéaire** en fonction de n.\n",
|
|
"\n",
|
|
"⚠️ Mais il y a **trop d'appels de fonctions** imbriqués et Python ne peut pas calculer au delà de n=2900.\n",
|
|
"\n",
|
|
"Malgré tout, les performances sont bien en dessous de nos premiers algorithmes car ici il faut environ 1 ms pour calculer le terme avec n=2960 alors qu'il en fallait à peine 0.25 ms avec les premiers.\n",
|
|
"\n",
|
|
"# Conclusion\n",
|
|
"\n",
|
|
"⚠️ La **récursivité** permet de résoudre **facilement** des **problèmes complexes** mais elle s'accompagne souvent de **problèmes de performances**.\n",
|
|
"\n",
|
|
"⚠️ La **programmation dynamique** permet de gagner du temps dans les algorithmes car elle consiste à **enregistrer les résultats intermédiaires calculés** afin de les **ré-utiliser plus tard** dans l'algorithme.\n",
|
|
"\n",
|
|
"Cette technique est souvent utilisée dans les problèmes **d'optimisation** car dans ce domaine, les calculs utilisent souvent **plusieurs fois les mêmes valeurs**."
|
|
]
|
|
}
|
|
],
|
|
"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.8.5"
|
|
},
|
|
"widgets": {
|
|
"application/vnd.jupyter.widget-state+json": {
|
|
"state": {},
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
}
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|