Perguntas da entrevista da fábrica de recursão de fechamento

Requisito: implemente uma função add function, chame add(1,2,3)(4)(5,6)() e o resultado de saída é 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

Como o número de parâmetros é variável toda vez que a função é chamada, considere o uso de argumentos para receber e processar parâmetros. Ao escrever esta pergunta, sempre penso em outra pergunta:

A ideia de usar encerramento + recursão também é a mesma. Através de add(1)(2)(3)(), cada chamada passa um parâmetro por vez, e os parâmetros podem ser recebidos de forma convencional. O código é do seguinte modo:

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

Como as formas das duas perguntas são muito parecidas, tenho pensado em como aplicá-las (bom demais), inclusive não conseguir descobrir onde fica a saída recursiva e, finalmente, soltar as algemas e, de repente, abrir Se você tiver outras idéias e métodos, por favor, obrigado por seu conselho.

Vamos fazer de novo, implemente 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

Eu sinto que compreendi a maneira sem cérebro de escrever esse tipo de pergunta, então irei para a pergunta ~

Acho que você gosta

Origin blog.csdn.net/qq_62070939/article/details/129974043
Recomendado
Clasificación