diff --git a/slides/cours_5.md b/slides/cours_5.md index 1f7c472da9570a3383d5b2b23cd9fb9f5c05f880..6d78fb64a3335279816b2bad01c3de11de0e4c24 100644 --- a/slides/cours_5.md +++ b/slides/cours_5.md @@ -769,7 +769,6 @@ void recurse(int n) { printf("\n"); } } - recurse(13); ``` @@ -784,113 +783,4 @@ binaire(13): n = 13, n % 2 = 1, n / 2 = 6, // affiche: 1 1 0 1 ``` -# Exercice: réusinage et récursivité (1/4) - -## Réusiner le code du PGCD avec une fonction récursive - -## Étudier l'exécution - -```C -42 = 27 * 1 + 15 -27 = 15 * 1 + 12 -15 = 12 * 1 + 3 -12 = 3 * 4 + 0 -``` - -# Exercice: réusinage et récursivité (2/4) - -## Réusiner le code du PGCD avec une fonction récursive - -## Étudier l'exécution - -```C -42 = 27 * 1 + 15 | PGCD(42, 27) -27 = 15 * 1 + 12 | PGCD(27, 15) -15 = 12 * 1 + 3 | PGCD(15, 12) -12 = 3 * 4 + 0 | PGCD(12, 3) -``` - -# Exercice: réusinage et récursivité (3/4) - -## Réusiner le code du PGCD avec une fonction récursive - -## Étudier l'exécution - -```C -42 = 27 * 1 + 15 | PGCD(42, 27) -27 = 15 * 1 + 12 | PGCD(27, 15) -15 = 12 * 1 + 3 | PGCD(15, 12) -12 = 3 * 4 + 0 | PGCD(12, 3) -``` - -## Effectuer l'empilage - dépilage - -. . . - -```C -PGCD(12, 3) | 3 -PGCD(15, 12) | 3 -PGCD(27, 15) | 3 -PGCD(42, 27) | 3 -``` - -# Exercice: réusinage et récursivité (4/4) - -## Écrire le code - -. . . - -```C -int pgcd(int n, int m) { - if (n % m > 0) { - return pgcd(m, n % m); - } else { - return m; - } -} -``` - -# La suite de Fibonacci - -## Règle - -$$ -\mathrm{Fib}(n) = \mathrm{Fib}(n-1) + \mathrm{Fib}(n-2),\quad -\mathrm{Fib}(0)=0,\quad \mathrm{Fib}(1)=1. -$$ - -## Exercice: écrire la fonction $\mathrm{Fib}$ en récursif et impératif - -```C -int fib(int n) { - if (n > 1) { - return fib(n - 1) + fib(n - 2); - } else { - return n; - } -} -``` - -```C -int fib_imp(int n) { - int fib0 = 1; - int fib1 = 1; - int fib = n == 0 ? 0 : fib1; - for (int i = 2; i < n; ++i) { - fib = fib0 + fib1; - fib0 = fib1; - fib1 = fib; - } - return fib; -} -``` - - -# Exercices pour les semaines sans cours - -## Quelques algorithmes à réaliser et poster sur matrix - -1. Algorithme du PPCM. -2. La puissance indienne. -3. La suite de Fibonacci. diff --git a/slides/cours_6.md b/slides/cours_6.md new file mode 100644 index 0000000000000000000000000000000000000000..4940d6a6232c7c00a03cff1df90e21ea6eede040 --- /dev/null +++ b/slides/cours_6.md @@ -0,0 +1,196 @@ +--- +title: "Récursivité" +date: "2021-11-03" +patat: + eval: + tai: + command: fish + fragment: false + replace: true + ccc: + command: fish + fragment: false + replace: true + images: + backend: auto +... + +# La récursivité (1/2) + +* Code récursif + + ```C + int factorial(int n) { + if (n > 1) { // Condition de récursivité + return n * factorial(n - 1); + } else { // Condition d'arrêt + return 1; + } + } +``` + +. . . + +* Code impératif + + ```C + int factorial(int n) { + int f = 1; + for (int i = 1; i < n; ++i) { + f *= i; + } + return f; + } + ``` + +# Exercice: réusinage et récursivité (1/4) + +## Réusiner le code du PGCD avec une fonction récursive + +## Étudier l'exécution + +```C +42 = 27 * 1 + 15 +27 = 15 * 1 + 12 +15 = 12 * 1 + 3 +12 = 3 * 4 + 0 +``` + +# Exercice: réusinage et récursivité (2/4) + +## Réusiner le code du PGCD avec une fonction récursive + +## Étudier l'exécution + +```C +42 = 27 * 1 + 15 | PGCD(42, 27) +27 = 15 * 1 + 12 | PGCD(27, 15) +15 = 12 * 1 + 3 | PGCD(15, 12) +12 = 3 * 4 + 0 | PGCD(12, 3) +``` + +# Exercice: réusinage et récursivité (3/4) + +## Réusiner le code du PGCD avec une fonction récursive + +## Étudier l'exécution + +```C +42 = 27 * 1 + 15 | PGCD(42, 27) +27 = 15 * 1 + 12 | PGCD(27, 15) +15 = 12 * 1 + 3 | PGCD(15, 12) +12 = 3 * 4 + 0 | PGCD(12, 3) +``` + +## Effectuer l'empilage - dépilage + +. . . + +```C +PGCD(12, 3) | 3 +PGCD(15, 12) | 3 +PGCD(27, 15) | 3 +PGCD(42, 27) | 3 +``` + +# Exercice: réusinage et récursivité (4/4) + +## Écrire le code + +. . . + +```C +int pgcd(int n, int m) { + if (n % m > 0) { + return pgcd(m, n % m); + } else { + return m; + } +} +``` + +# La suite de Fibonacci (1/2) + +## Règle + +$$ +\mathrm{Fib}(n) = \mathrm{Fib}(n-1) + \mathrm{Fib}(n-2),\quad +\mathrm{Fib}(0)=0,\quad \mathrm{Fib}(1)=1. +$$ + +## Exercice: écrire la fonction $\mathrm{Fib}$ en récursif et impératif + +. . . + +## En récursif (6 lignes) + +```C +int fib(int n) { + if (n > 1) { + return fib(n - 1) + fib(n - 2); + } + return n; +} +``` + +# La suite de Fibonacci (2/2) + +## Et en impératif (11 lignes) + +```C +int fib_imp(int n) { + int fib0 = 1; + int fib1 = 1; + int fib = n == 0 ? 0 : fib1; + for (int i = 2; i < n; ++i) { + fib = fib0 + fib1; + fib0 = fib1; + fib1 = fib; + } + return fib; +} +``` + +# Exponentiation rapide ou indienne (1/N) + +## But: Calculer $x^n$ + +* Algorithme naîf et impératif + + ```C + int pow(x, n) { + if (0 == n) { + return 1; + } + for (int i = 1; i < n; ++i) { + x *= x; + } + return x; + } + ``` + +. . . + +* Complexité? Combien de multiplication en fonction de `n`? + +# Exponentiation rapide ou indienne (1/N) + +* Algorithme naïf et récursif + + ```C + int pow(x, n) { + if (n != 0) { + return x * pow(x, n-1); + } else { + return 1; + } + } + ``` + +# Exercices pour les semaines sans cours + +## Quelques algorithmes à réaliser et poster sur matrix + +1. Algorithme du PPCM. +2. La puissance indienne. +