La somme avec une quantité arbitraire de parenthèses
É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.
- Pour que tout fonctionne * de toute façon *, le résultat de
sum
doit être fonction. - Cette fonction doit garder en mémoire la valeur actuelle entre les appels.
- 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
ou valueOf
ici pour la conversion.