• Циклы, рекурсия и массивы в JAVASCRIPT?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    arrayToList - а точно список должен формироваться в обратном порядке? Если да, то почему listToArray формирует в прямом?
    listToArray(arrayToList([1, 2, 3])); // Array(3) [ 3, 2, 1 ]

    Функция prepend работает неправильно, переворачивая исходный список.
    const list = {
      value: 2,
      rest: {
        value: 3,
        rest: null,
      },
    };
    prepend(1, list);
    /* 
    Object {
      value: 1,
      rest: Object {
        value: 3,
        rest: Object {
          value: 2,
          rest: null
        }
      }
    }
    */

    Рекурсивные варианты

    const arrayToList = (arr, idx = 0) => ({
      value: arr[idx],
      rest: idx === arr.length - 1
              ? null
              : arrayToList(arr, idx + 1)
    });
    const listToArray = (list) => (
      list.rest === null
        ? [list.value]
        : [list.value, ...listToArray(list.rest)]
    );
    const prepend = (value, rest) => ({ value, rest });
    const nth = (list, idx) => (
      idx === 0
        ? list.value
        : (
          list.rest === null
            ? undefined
            : nth(list.rest, idx - 1)
        )
    );


    Нерекурсивные варианты

    const arrayToList = (arr) => {
      const list = null;
      for (let i = arr.length - 1; idx >= 0; idx -= 1) {
        list = { value: arr[idx], rest: list };
      }
      return list;
    };
    const listToArray = (list) => {
      const arr = [];
      while (list !== null) {
        arr.push(list.value);
        list = list.rest;
      }
      return arr;
    };
    const prepend = (value, rest) => ({ value, rest });
    const nth = (list, idx) => {
      while (list !== null) {
        if (idx === 0) {
          return list.value;
        }
        idx -= 1;
        list = list.rest;
      }
    };

    Ответ написан
    Комментировать
  • Циклы, рекурсия и массивы в JAVASCRIPT?

    RAX7
    @RAX7
    Для читаемости можно вынести часто повторяющиеся выражения в переменную
    function arrayToList(array) {
      const last = array.length - 1;
      return {
        value: array[last],
        rest: last === 0 ? null : arrayToList(array.slice(0, last))
      };
    }

    Для скорости - не использовать array.slice, т.к. копирование массива довольно дорого
    function arrayToList(array, idx = array.length - 1) {
      return {
        value: array[idx],
        rest: idx === 0 ? null : arrayToList(array, idx - 1)
      };
    }
    Ответ написан
    Комментировать
  • Циклы, рекурсия и массивы в JAVASCRIPT?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Ничего, разве что ; расставить. Я бы ещё длинную строку кое-как разбил, но это вкусовшина. Ещё я бы писал arr вместо array, ибо в других языках это зарезервированное слово, да и в js есть Array (а также obj вместо object), но не уверен, что это улучшит читабельность именно для новичков.
    Ответ написан
    Комментировать
  • Задачка на массивы и циклы JS?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const reverseArray = (arr) =>
      arr.reduceRight((acc, item) => (acc.push(item), acc), []);
    
    const reverseArrayInPlace = (arr) => {
      for (let i = 0, j = arr.length - 1; i < j; i += 1, j -= 1) {
        [arr[i], arr[j]] = [arr[j], arr[i]];
      }
    };
    Ответ написан
    3 комментария
  • Задачка на массивы и циклы JS?

    @wonderingpeanut
    Текущая имплементация имеет пространственную и временную сложность (time/space complexity) О(n). Можно улучшить space complexity до О(1): изменить массив in place - без создания временного массива.
    Можно сделать одним циклом. Подумай как можно получить элемент с другого конца массива, имея значение текущего индекса элемента.
    Ответ написан
    3 комментария
  • Задачка на массивы и циклы JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Лучше, наверное, без временного массива, по-честному in-place:
    берёшь пару элементов и меняешь их местами.
    • Первый с последним.
    • Второй с предпоследним.
    • ?????
    • Profit!
    В цикле придётся пройти всего пол-массива.
    синтакс

    Современный синтакс позволяет менять местами два элемента без временной переменной:
    // a и b взаимно обменялись значениями:
    [ a, b ] = [ b, a ];
    
    
    const arr = [1, 2, 3, 4, 5];
    [arr[0], arr[4]] = [arr[4], arr[0]];
    arr // [5, 2, 3, 4, 1]

    Ответ написан
    2 комментария
  • Задачка на циклы в JavaScript?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const chars = [' ', '#'];
    const size = 8;
    str = '';
    for (let i = 0; i < size; i++) {
      for (let j = 0; j < size; j++) {
        str += chars[(i + j) % 2];
      }
      str += '\n';
    }
    console.log(str);
    Ответ написан
    7 комментариев
  • Задача на циклы в JavaScript?

    @eGenius18
    - работает? работает!
    - всё норм? всё норм!

    не усложняй читабельность и следущие разрабы тебе спасибо скажут))

    ps: только надо бы с нуля начинать)
    Ответ написан
    2 комментария
  • Задача на циклы в JavaScript?

    GavriKos
    @GavriKos
    Улучшать такой примитивный код да еще в отрыве от задачи - бесполезное занятие. Тем более на таком начальном уровне знаний.
    Поняли как работают циклы? Сможете применить на практике? Все, следующая задача.

    А то можно щас начать про потребление памяти при сложении строк, про var/let... Суть то задания не в этом
    Ответ написан
    3 комментария