Как вернуть новый массив из рекурсивной функции? || Javascript

Столкнулся с проблемой читая статью по Рекурсии.

отрывок статьи:

Построение списков

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

function remove(item, l){
     if (empty(l)) {
         return [];
     } else if (eq(car(l), item)) {
         return cdr(l);
     } else {
         return cons(car(l), remove(item, cdr(l)));
     }
 }
  
 remove('c', ['a', 'b', 'c', 'd'])    // [‘a’, ‘b’, ‘d’]

функция empty возвращает true, если в списке нет элементов. Функция car возвращает первый элемент в списке. Например, car([1,2,3,4]) возвращает 1. Функция cdr возвращает список без первого элемента. Например, cdr([1,2,3,4]) возвращает [2,3,4]

функция eq возвращает true, если оба входа одинаковы. Функция cons использует элемент и список как входные данные и возвращает новый список с добавленным элементом к началу.

Мы будем проверять, совпадает ли первый элемент в списке с элементом, который мы хотим удалить. Если это так, удалите первый элемент из списка и верните новый список. Если первый элемент не равен элементу, который мы хотим удалить, мы берем первый элемент в списке и добавляем его на рекурсивный шаг. Рекурсивный шаг будет содержать список с удаленным первым элементом.

Мы будем удалять элементы до тех пор, пока мы не достигнем базового варианта, который является пустым списком. Пустой список означает, что мы прошли все элементы в нашем списке. Что делает remove('c', ['a', 'b', 'c', 'd'])?

представление как работает функция:

remove('c', ['a', 'b', 'c', 'd'])
 cons( ‘a’,  remove(‘c’, [‘b’, ‘c’, ‘d’]) )
 cons( ‘a’ , cons( ‘b’, remove(‘c’, [‘c’, ‘d’]) ))
 cons( ‘a’, cons( ‘b’, [‘d’] )
 cons( ‘a’, [‘b’, ‘d’])
 [‘a’, ‘b’, ‘d’]

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

подскажите как здесь работает функция cons? вот пример реализации неоговоренных функций в моем коде, методом подбора у меня получилось вернуть пока только строку(как говориться хоть что-то):

function remove(item, l) {
  if (empty(l)) {
    return []
  } else if (eq(car(l), item)) {
    return cdr(l)
  } else {
    return cons(  car(l) + remove(item, cdr(l)) )
  }
}

function empty(l) {
  return l == false
}

function cdr(l) {
  return l.slice(1)
}

function car(l) {
  return l[0]
}

function eq(item1, item2) {
  return item1 == item2
}

 function cons(item, l) {
    return item
}

console.log( remove('c', ['a', 'b', 'c', 'd] // 'abd'

как реализовать cons так чтоб она возвращала массив а не строку?


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

cons('a', ['b', 'c', 'd']) вернёт ['a', 'b', 'c', 'd'].

Можно реализовать так:

function cons(head, tail) {
    return [head].concat(tail);
}
→ Ссылка