Функция каррирования с неизвестными аргументами в JavaScript - PullRequest
0 голосов
/ 10 мая 2018

В недавнем интервью меня попросили написать функцию, которая добавляет числа и принимает параметры, подобные этому:

add(1)(2)(3) // result is 6
add(1,2)(3,4)(5) // result is 15

Количество параметров не является фиксированным, и аргументы могут передаваться либо в наборах, либо по отдельности.

Как я могу реализовать эту add функцию?

1 Ответ

0 голосов
/ 11 мая 2018

В ваших примерах количество параметров в некоторых случаях фиксировано.

Как указал @ASDFGerte, ваши примеры, похоже, возвращают результат после трех вызовов. В этом случае простая реализация без введения таких терминов, как переменная и карри может быть

function add(...args1){
  return function(...args2){
    return function(...args3){
      return args1.concat(args2).concat(args3).reduce((a,b)=>a+b)}}}
                
console.log(add(1)(2)(3))
console.log(add(1,2)(3,4)(5))

Каждый вызов принимает переменное количество параметров.

Однако было бы неплохо обобщить построение этой структуры вложенных функций, и вы можете сделать это с помощью карри.

Но если вы хотите разрешить произвольное количество вызовов, когда вам следует прекратить возвращать новую функцию и возвращать результат? Нет способа узнать, и это простое, неточное и частичное объяснение, которое даст вам представление о том, почему они сказали, что вы не можете выполнить то, о чем вас просили.

Итак, главный вопрос: возможно ли, что вы неправильно поняли вопрос? Или, может быть, это был трюк, чтобы проверить вас

Редактировать

Другой вариант - вызвать функцию, когда аргументы не переданы, изменить вызов на add(1)(2)(3)()

Вот пример рекурсивной реализации

function sum (...args) {
  let s = args.reduce((a,b)=>a+b)

   return function (...x) {
     return x.length == 0 ? s : sum(s, ...x)
    };
}
console.log(sum(1,2)(2,3,4)(2)())

При каждом вызове вычисляет сумму текущих параметров, а затем возвращает новую функцию, которая:

  • если вызывается без параметров, просто вернуть текущую сумму
  • если переданы другие числа, вызывает рекурсивную сумму, передавая фактическую сумму и новые числа
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...