retour au cours

La somme avec une quantité arbitraire de parenthèses

importance: 2

Écrivez la fonction sum qui fonctionnerait comme ceci:

sum(1)(2) == 3; // 1 + 2
sum(1)(2)(3) == 6; // 1 + 2 + 3
sum(5)(-1)(2) == 6
sum(6)(-1)(-2)(-3) == 0
sum(0)(1)(2)(3)(4)(5) == 15

P.S. Indice: vous devrez peut-être configurer une conversion d’objet à primitive personnalisé pour votre fonction.

Open a sandbox with tests.

  1. Pour que tout fonctionne * de toute façon *, le résultat de sum doit être fonction.
  2. Cette fonction doit garder en mémoire la valeur actuelle entre les appels.
  3. Selon la tâche, la fonction doit devenir le numéro lorsqu’elle est utilisée dans ==. Les fonctions étant des objets, la conversion s’effectue comme décrit dans le chapitre Conversion d'objet en primitive, et nous pouvons fournir notre propre méthode qui renvoie le nombre.

Maintenant le code:

function sum(a) {

  let currentSum = a;

  function f(b) {
    currentSum += b;
    return f;
  }

  f.toString = function() {
    return currentSum;
  };

  return f;
}

alert( sum(1)(2) ); // 3
alert( sum(5)(-1)(2) ); // 6
alert( sum(6)(-1)(-2)(-3) ); // 0
alert( sum(0)(1)(2)(3)(4)(5) ); // 15

Veuillez noter que la fonction sum ne fonctionne réellement qu’une fois. Il renvoie la fonction f.

Ensuite, à chaque appel suivant, f ajoute son paramètre à la somme currentSum, et se renvoie lui-même.

Il n’y a pas de récursion dans la dernière ligne de f.

Voici à quoi ressemble la récursion:

function f(b) {
  currentSum += b;
  return f(); // <-- appel récursif
}

Et dans notre cas, nous renvoyons simplement la fonction, sans l’appeler:

function f(b) {
  currentSum += b;
  return f; // <-- ne s'appelle pas, se renvoie
}

Ce f sera utilisé lors du prochain appel et se renvera lui-même autant de fois que nécessaire. Ensuite, lorsqu’il est utilisé sous forme de nombre ou de chaîne de caractères, le toString renvoie le currentSum. Nous pourrions aussi utiliser Symbol.toPrimitive ouvalueOf ici pour la conversion.

Ouvrez la solution avec des tests dans une sandbox.