Задать вопрос
andreyka_g
@andreyka_g

[задача]Выразительный JavaScript: перевести массив в список?

Читая книгу Выразительный JavaScript, я наткнулся на такую задачу:
Напишите функцию arrayToList, которая строит такую структуру, получая в
качестве аргумента [1, 2, 3], а также функцию listToArray, которая создаёт
массив из списка. Также напишите вспомогательную функцию prepend,
которая получает элемент и создаёт новый список, где этот элемент
добавлен спереди к первоначальному списку, и функцию nth, которая в
качестве аргументов принимает список и число, а возвращает элемент на
заданной позиции в списке, или же undefined в случае отсутствия такого
элемента.
Если ваша версия nth не рекурсивна, тогда напишите её рекурсивную
версию.
(гл. 6)
На выходе должно быть так:
console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}}
console.log(listToArray(arrayToList([10, 20, 30])));
// → [10, 20, 30]
console.log(prepend(10, prepend(20, null)));
// → {value: 10, rest: {value: 20, rest: null}}
console.log(nth(arrayToList([10, 20, 30]), 1));
// → 20

Но решение вообще никакое в голову не приходит. Как правильнее будет написать эту программу?
  • Вопрос задан
  • 3241 просмотр
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
standy
@standy
Чтобы понять рекурсию, нужно понять рекурсию.
Если вам напишут ответ, то как вы чему-нибудь научитесь?
Ответ написан
@localghost
Может быть, вам будет проще пойти с конца массива?
Ответ написан
Комментировать
@volterone
Может так?

function arrayToList(array) {
    if (array.length > 1) {
        return { value: array.shift(), rest: arrayToList(array) };
    } else {
        return { value: array.shift(), rest: null };
    }
}


Интересует мнение знатоков по поводу этого кода. Пример из поста данная функция отрабатывает правильно.
Ответ написан
@fastpock
function arrayToList(arr)
{
var currentElement = 0;
while (arr[currentElement]) {
if (currentElement == (arr.length - 1)) {
return {value: arr[currentElement], next: null};
}
return {value: arr[currentElement],
next: arrayToList(arr.slice(++currentElement))};
}
}
var list = arrayToList([1, 2, 3, 4]);
console.log(list);

function listToArray(list)
{
//Вариант 1
/*var arr = [];
while (list){
arr.push(list.value);
list = list.next;
}
return arr;*/
//Вариант 2
if (list.next == null) {
return [list.value];
}

return [list.value].concat(listToArray(list.next));

}
list1 = listToArray(list);
console.log(list1);

function prepend(num, list)
{
return {value: num, next: list};
}
console.log(prepend(0, list));

function nth(list, pos)
{
if (list == null) return undefined;
else {
if(1 == pos) return list.value;
return nth(list.next, --pos);
}
}
console.log(nth(list, 4));
Ответ написан
Комментировать
Voroba1996
@Voroba1996
JS разработчик
function arrayToList(array){
    return {
        value: array[array.length - 1],
        rest: array.length - 1 === 0 ? null : arrayToList(array.slice(0, array.length - 1))
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы