Javascript: Рекурсивно считать сумму всех элементов в массиве? - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь написать рекурсивную функцию для подсчета количества элементов в массиве, используя Javascript.

Я могу сделать это на Python:

def count(list):
 if list == []:
  return 0
 return 1 + count(list[1:]) 

Как мне это сделать?это в ES5 и ES6?

Ответы [ 5 ]

1 голос
/ 09 мая 2019

Самый удобный способ написания этого кода. Работает на всех итерациях.

const count = xs =>
  xs[Symbol.iterator]().next().done
    ? 0
    : 1 + (([,...xr]) => count(xr))(xs);

console.log(count([1,2,3]));
console.log(count("hello123"));
console.log(count({
    *[Symbol.iterator]() {
        yield 1;
        yield 2;
        yield 3;
        yield 4;
    }
}));
console.log(count([]));
console.log(count([1, undefined, 2]));
1 голос
/ 09 мая 2019

ES6 рекурсивная функция:

const count = arr => arr[0] == undefined ? 0 : 1 + count(arr.slice(1));
console.log(count([1, 2, 3]));
console.log(count([]));

ES5:

function count(arr) {
  return arr[0] == undefined ? 0 : 1 + count(arr.slice(1));
}
console.log(count([1, 2, 3]));
console.log(count([]));
1 голос
/ 09 мая 2019

Во-первых, вы должны знать, что arrays имеет свойство .length для этой цели.Зная это, и если вы все еще хотите получить его рекурсией, я сделаю что-то вроде следующего, использующее итератор и Array.slice () .Этот подход позволяет избежать использования свойства .length для определения условия остановки.

const count = (list) =>
{
    let ite = list[Symbol.iterator]();

    if (ite.next().done)
        return 0;
    else
        return 1 + count(list.slice(1));
}

console.log(count([]));
console.log(count([undefined, null]));
console.log(count([1, 2, undefined, 3, 4]));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
0 голосов
/ 02 июля 2019

Вот два решения.

const count1 = ([x, ...xs]) => x ? 1 + count1(xs) : 0
const count2 = (xs) => xs.reduce((y) => y + 1, 0)

console.log(count1([1, 2, 3, 4, 5]))
console.log(count2([1, 2, 3, 4, 5]))
0 голосов
/ 09 мая 2019

Подсчет элементов смешно, так как вы можете просто взять свойство length.Это будет O (1) и делать то, что вы ожидаете.Что касается суммирования или выполнения чего-либо с элементами:

// recursively. Works only on arrays 
const sumElements = (arr) => {
  if (arr.length === 1) return arr[0];

  const [e, ...rest] = arr;
  return e + sumElements(rest);
}


// recursively and effiecent. Works only on arrays
const sumElements = (arr) => {
  const helper = (index, acc) => index < 0 ? acc helper(index - 1, acc + arr[index]);
  return helper(arr.length-1, 0);
}


// using higher order functions. Works for all collections that has reduce defined
const sumElements = list => list.reduce((acc, e) => acc + e), 0);

// using iterators. Works for all collections that has iterator defined
const sumElements = (list) => {
  let sum = 0;
  for (const e of list) {
    sum += e;
  }
  return sum;
}
...