|
| 1 | +La base de travail fournie plus bas contient une définition de `repeat()`. Celle-ci recevra une opération sous forme de `Function`, et un nombre `num`, pour invoquer la fonction `num` fois : |
| 2 | + |
| 3 | +```js |
| 4 | +var count = 0 |
| 5 | +repeat(function() { |
| 6 | + count++ |
| 7 | +}, 100) |
| 8 | + |
| 9 | +console.log('exécuté %d fois.', count) |
| 10 | +// => exécuté 100 fois. |
| 11 | +``` |
| 12 | + |
| 13 | +MAIS vous remarquerez qu’exécuter `repeat()` avec un nombre trop grand de répétitions causera un débordement de pile (*stack overflow*) : |
| 14 | + |
| 15 | +``` |
| 16 | +var count = 0 |
| 17 | +repeat(function() { |
| 18 | + count++ |
| 19 | +}, 100000) |
| 20 | +
|
| 21 | +console.log('exécuté %d fois', count) |
| 22 | +// => RangeError: Maximum call stack size exceeded |
| 23 | +``` |
| 24 | + |
| 25 | +# Défi |
| 26 | + |
| 27 | +Modifiez la base de travail ci-dessous pour qu’elle utilise un trampoline afin que la fonction s’appelle elle-même continuellement. |
| 28 | + |
| 29 | +Vous pouvez supposer que l’opération qui vous sera fournie ne prend aucun argument (ou qu’ils sont déjà pré-remplis), et que sa valeur de retour est sans importance. |
| 30 | + |
| 31 | +## Conditions |
| 32 | + |
| 33 | +Vos modifications de l’implémentation de `repeat()` ne doivent pas utiliser de boucles ou d’itérateurs (ex. `forEach()`). |
| 34 | + |
| 35 | +## Conseils |
| 36 | + |
| 37 | +- Modifiez `repeat()` pour qu’elle envoie la « prochaine étape », s’il y en a une. |
| 38 | +- Un trampoline continue à exécuter les étapes en obtenant à chaque tour la suivante, jusqu’à ce qu’il n’y en ait plus. Pour le coup, vous pouvez utiliser une boucle dans votre fonction de trampoline ! |
| 39 | +- Si votre programme prend trop de temps à s’exécuter, vous avez probablement un souci. Utilisez Ctrl+C pour arrêter le processus Node. |
| 40 | + |
| 41 | +## Base de travail |
| 42 | + |
| 43 | +```js |
| 44 | +function repeat(operation, num) { |
| 45 | + // Modifiez ce code pour qu’il ne cause pas de débordement de pile ! |
| 46 | + if (num <= 0) return |
| 47 | + operation() |
| 48 | + return repeat(operation, --num) |
| 49 | +} |
| 50 | + |
| 51 | +function trampoline(fn) { |
| 52 | + // Voilà où implémenter votre trampoline ; une boucle est autorisée ici. |
| 53 | +} |
| 54 | + |
| 55 | +module.exports = function(operation, num) { |
| 56 | + // Et voilà où vous voudrez sans doute plutôt appeler votre trampoline ! |
| 57 | + return repeat(operation, num) |
| 58 | +} |
| 59 | +``` |
0 commit comments