Ошибка типа в этой рекурсивной задаче добавления массива

#javascript #arrays #recursion

#javascript #массивы #рекурсия

Вопрос:

Эта функция должна рекурсивно добавлять все константы в массив, используя JavaScript. Есть идеи, почему я получаю ошибку типа в этой функции рекурсии?

 const slowAdd = (array) => {
  if (array.length === 0) return 0;

  const restOfArray = array.slice(1);

  return array[0]   slowAdd(array[restOfArray]);
}

const dataArray = [2, 5, 7]
slowAdd(dataArray); 

Та же проблема с использованием вспомогательной функции:

 const fastSum = (array) => {
  return _fastSum(array, 0);
};

const _fastSum = (array, start) => {
  if (start === array.length) return 0;

  return array[start]   _fastSum(array, start   1);
}

const dataArray = [2, 5, 7]
console.log(fastSum(dataArray)); 

Почему fastSum рекурсия работает, а первая — нет.

Комментарии:

1. array[restOfArray] это одно число, а не другой массив. РЕДАКТИРОВАТЬ: хорошо, на самом деле restOfArray это остальная часть массива. Я неправильно понял это и подумал, что это просто индекс. Во всяком случае array[restOfArray] , конечно, не создает другой массив и slowAdd ожидает массив

2. @VLAZ Это даже не даст числа. Он вернет undefined

3. @MaheerAli действительно. Я изначально неправильно прочитал код и подумал restOfArray , что это будет индекс. Однако, когда это массив , большую часть времени он будет выдавать undefined , как вы сказали.

Ответ №1:

restOfArray сам по себе является массивом, и вы пытаетесь использовать его как индекс другого массива. array[restOfArray] всегда будет возвращаться undefined .

вы должны передать restOfArray вместо array[restOfArray]

 const slowAdd = (array)=>{
    
    if(array.length === 0) return 0;

    const restOfArray = array.slice(1);

    return array[0]   slowAdd(restOfArray);

}

const dataArray = [2, 5, 7]
console.log(slowAdd(dataArray));

//Same Problem with this one.

const fastSum = (array)=>{
    return _fastSum(array, 0);
};
const _fastSum = (array, start)=>{
    if(start === array.length) return 0;

    return array[start]   _fastSum(array, start   1);

}

console.log(fastSum(dataArray)); 

Ответ №2:

restOfArray — это массив

 const slowAdd = (array) => {
  if (array.length === 0) return 0;

  const restOfArray = array.slice(1);

  return array[0]   slowAdd(restOfArray);
}

const dataArray = [2, 5, 7]
slowAdd(dataArray);