JavaScript Рекурсивная функция возвращает неопределенный вместо массива - PullRequest
0 голосов
/ 24 марта 2020

У меня есть следующая функция:

function solveSudoku(prev_tab, fila, columna) {

  let tab = _.cloneDeep(prev_tab);
  let sig_fila = fila;
  let sig_col = columna;

  if (fila === 8 && columna === 8) {
    //console.log(tab);
    return tab;
  }

  if (columna === 8) {
    sig_col = 0;
    sig_fila = sig_fila + 1
  } else {
    sig_col = sig_col + 1;
  }

  if ((tab[fila][columna]) !== '') {
    solveSudoku(tab, sig_fila, sig_col)
  } else {
    for (let num = 1; num <= 9; num++) {
      if (numeroValido(tab, num, fila, columna)) {
        tab[fila][columna] = num;
        //tab.toString();
        solveSudoku(tab, sig_fila, sig_col)
      }
    }
  }
}

она возвращает неопределенный вместо двумерного массива, я уже пытаюсь добавить return в каждом рекурсивном вызове =>

return solveSudoku( tab, sig_fila, sig_col )

, но сейчас это тоже не работает

1 Ответ

0 голосов
/ 24 марта 2020

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

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

function solveSudoku(prev_tab, fila, columna) {

  let tab = _.cloneDeep(prev_tab);
  let sig_fila = fila;
  let sig_col = columna;

  if (fila === 8 && columna === 8) {
    //console.log(tab);
    return tab;
  }

  if (columna === 8) {
    sig_col = 0;
    sig_fila = sig_fila + 1
  } else {
    sig_col = sig_col + 1;
  }

  if ((tab[fila][columna]) !== '') {
    return solveSudoku(tab, sig_fila, sig_col)
  } else {
    for (let num = 1; num <= 9; num++) {
      if (numeroValido(tab, num, fila, columna)) {
        tab[fila][columna] = num;
        //tab.toString();
        let result = solveSudoku(tab, sig_fila, sig_col);
        if (result) { // continue searching if the recursion failed
          return result;
        }
      }
    }
  }
}
...