Как я могу предотвратить превышение этой рекурсивной функцией максимального стека вызовов? - PullRequest
0 голосов
/ 05 августа 2020

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

import { CellState } from "./types";

const InitialCellsState = (): CellState[] => {
const cellsState: CellState[] = [{ columnIndex: 1, rowIndex: 1 }];

function addCellByRow(cell: CellState) {
    cellsState.push(cell);
    if (cell.rowIndex === 50) {
        if (cell.columnIndex === 50) {
            return;
        }
        addCellByRow({ columnIndex: cell.columnIndex + 1, rowIndex: 1 });
    }
    addCellByRow({ columnIndex: cell.columnIndex, rowIndex: cell.rowIndex + 1 });
}

   addCellByRow(cellsState[0]);

   return cellsState;
};

export default InitialCellsState;

Это бесконечный цикл или просто слишком много?

Ответы [ 2 ]

3 голосов
/ 05 августа 2020

Зачем вообще здесь рекурсия? Вы просто вводите накладные расходы на вызов метода там, где в этом нет необходимости! . Это означает, что первая строка продолжается вечно.

0 голосов
/ 05 августа 2020

Регулярные циклы, вероятно, будут более эффективными, чем рекурсия, но это поможет ...

interface CellState {
  columnIndex: number;
  rowIndex: number;
}

const InitialCellsState = (): CellState[] => {
  const cellsState: CellState[] = [];

  function addCellByRow(cell: CellState) {
    cellsState.push(cell);
    if (cell.rowIndex === 50) {
      // you dont need to handle a case you're just going to return anyway
      if (cell.columnIndex !== 50) { 
        addCellByRow({ columnIndex: cell.columnIndex + 1, rowIndex: 1 });
      }
    } else { // not using an else will cause it to keep adding duplicates
      addCellByRow({
        columnIndex: cell.columnIndex,
        rowIndex: cell.rowIndex + 1
      });
    }
  }

  // don't populate the cellsstate with a starting value because you'll be adding a duplicate that way
  addCellByRow({ columnIndex: 1, rowIndex: 1 });

  return cellsState;
};

export default InitialCellsState;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...