Questions d'entretien d'usine de récursivité de fermeture

Exigence : implémentez une fonction add function, appelez add(1,2,3)(4)(5,6)() et le résultat de sortie est 21

function add() {
    res = [...arguments]
    return function () {
        if (arguments.length === 0) {
            return res.toString()//返回最终结果
        }
        return add([...res, ...arguments].reduce((pre, cur) => pre + cur))
    }
}
console.log(add(1, 2, 3)(4)(5, 6)());//21
console.log(add(1, 2, 3)(4)(5, 6)(7)());//28

Étant donné que le nombre de paramètres est indéfini à chaque fois que la fonction est appelée, envisagez d'utiliser des arguments pour recevoir et traiter les paramètres.Lorsque vous écrivez cette question, je pense toujours à une autre question :

C'est aussi l'idée d'utiliser fermeture + récursivité.Grâce à la méthode add(1)(2)(3)(), un paramètre est passé à tour de rôle pour chaque appel, et les paramètres peuvent être reçus de manière conventionnelle . Le code est comme suit:

function add(n) {
    if (!n) return res //递归出口
    res = n //使用全局变量将n的值保存
    return function(n) {
        return add(res+n)
    }
}

Parce que les formes des deux questions sont très similaires, j'ai réfléchi à la façon de les appliquer (dommage), y compris ne pas pouvoir trouver où se trouve la sortie récursive, et enfin lâcher les chaînes, puis s'ouvrir soudainement Si vous avez d'autres idées et méthodes, merci de vos conseils.

Recommençons, implémentez add() (1,2)(3,4)(7,8,9)()

function add() {
    return function () {
        res = [...arguments]
        return function () {
            return arguments.length === 0 ? res.toString() : add()([...res, ...arguments].reduce((pre, cur) => pre + cur))
        }
    }
}
console.log(add()(1, 2)(3, 4)(7, 8, 9)());//34

Je sens que j'ai saisi la manière stupide d'écrire ce genre de question, alors je vais aller à la question ~

Je suppose que tu aimes

Origine blog.csdn.net/qq_62070939/article/details/129974043
conseillé
Classement