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

Почему возникает ошибка «FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed — JavaScript heap out of memory»?

Задачка на codewars, написать логический калькулятор, я его написал(через кастыли разумеется) но с правильными значениями приходит FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory,
сама програмка(громко не смейтесь:) ) :

function logicalCalc(array, op){
  if ( op === "AND" ) {
    var kall = 0;
    for(var i=0 ; i<array.length ; i++) {
      if ( array[i] === false ) {
         kall = (kall + 1) }
      };
     if(kall === 0){return(true)}else{return(false)};
   } else { if ( op === "OR" ) {
        var kall = 0;
        for(var i=0 ; i<array.length ; i++) {
          if ( array[i] === true ) {
             kall = (kall + 1) }
          };
         if(kall === 0){return(false)}else{return(true)};
    }    else {
         var kall = 0;
          for(var i=0 ; i<array.length ; i++) {
            if ( (array[i]^ array[i+1])=== true) {
               array[i+1]=true;
               kall = kall + 1;
            }else{kall=0;array[i+1]=false;};}
           if(kall === 0){return(false)}else{return(true)};}}
 }
  • Вопрос задан
  • 259 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Ну, память кончилась. Потому что... так, представьте, что обрабатывается последний элемент вашего массива, и доходит очередь до вот этого:

array[i+1]=true;

Размер вашего массива увеличится, последний элемент перестанет быть последним, и цикл, вместо того, чтобы завершится, уйдёт на следующую итерацию. А там опять array[i+1]=true; (или array[i+1]=false;, в зависимости от условия) - массив снова увеличился, опять цикл не завершился, ну и так далее - массив будет жиреть до тех пор, пока станет невозможно выделить ему ещё памяти.

UPD. Я так понял, речь об этой задаче.
Решается вот прям совсем просто.

Конечно, при использовании методов массива:

const ops = {
  OR: arr => arr.some(Boolean),
  AND: arr => arr.every(Boolean),
  XOR: arr => !!arr.reduce((p, c) => p ^ c, 0),
};

const logicalCalc = (arr, op) => ops[op](arr);

В противном случае код может серьёзно опухнуть:

const ops = {
  OR(arr) {
    for (const n of arr) if (n) {
      return true;
    }
    return false;
  },
  AND(arr) {
    for (const n of arr) if (!n) {
      return false;
    }
    return true;
  },
  XOR(arr) {
    let result = false;
    for (const n of arr) if (n) {
      result = !result;
    }
    return result;
  },
};

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Sanasol
@Sanasol Куратор тега JavaScript
нельзя просто так взять и загуглить ошибку
array[i+1]=true;

Вы массив бесконечно увеличиваете, вот оно и падает в out of memory

Что за ад-то вообще с синтаксисом и т.д.
Не говоря уже про саму реализацию и оптимизированность в целом.
Вы что JS скриптов никогда не видели?
Ответ написан
Ваш ответ на вопрос

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

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