如何在JS中调试递归函数

问题描述 投票:1回答:2

我编写了以下递归代码,用于解决数独难题。

grid:表示难题的全局矩阵。可能的功能:对于给定的数字和位置,返回true或false解决:填充网格的递归。

但是我有一个错误,如何在不陷入无限循环的情况下调试它。

是否存在某种强制出口?您能发现错误吗?

let grid = [
  [5, 3, 0, 0, 7, 0, 0, 0, 0],
  [6, 0, 0, 1, 9, 5, 0, 0, 0],
  [0, 9, 8, 0, 0, 0, 0, 6, 0],
  [8, 0, 0, 0, 6, 0, 0, 0, 3],
  [4, 0, 0, 8, 0, 3, 0, 0, 1],
  [7, 0, 0, 0, 2, 0, 0, 0, 6],
  [0, 6, 0, 0, 0, 0, 2, 8, 0],
  [0, 0, 0, 4, 1, 9, 0, 0, 5],
  [0, 0, 0, 0, 8, 0, 0, 7, 9]];

function possible(x, y, n) {
  for (let i = 0; i < 9; i++) {
    if (grid[y][i] === n) {
      return false
    }
  }
  for (let i = 0; i < 9; i++) {
    if (grid[i][x] === n) {
      return false
    }
  }
  let x0 = Math.floor(x / 3) * 3;
  let y0 = Math.floor(y / 3) * 3;
  for (let i = 0; i < 3; i++) {
    for (let j = 0; j < 3; j++) {
      if (grid[y0 + i][x0 + j] === n) {
        return false
      }
    }
  }
  return true;
}

function solve() {
  for (let y = 0; y < 9; y++) {
    for (let x = 0; x < 9; x++) {
      if (grid[y][x] === 0) {
        for (let n = 1; n < 10; n++) {
          if(possible(y,x,n)){
            grid[y][x] = n;
            solve();
            grid[y][x] = 0;
          }
        }
        return;
      }
    }
  }
}

solve();
javascript recursion exit
2个回答
0
投票

标准调试技术通常应该在这里起作用。学习使用环境的调试器。例如,如果它正在您的浏览器中运行,则您应该能够在浏览器的开发人员工具中设置一个断点,并逐行浏览代码以尝试了解正在发生的事情。

递归始终要求存在一些导致递归结束的基本条件。在您的情况下,如果没有未解决的正方形,则可以通过返回true来表示,然后在调用链上传递该“成功”状态。

function solve() {
  for (let y = 0; y < 9; y++) {
    for (let x = 0; x < 9; x++) {
      if (grid[y][x] === 0) {
        for (let n = 1; n < 10; n++) {
          if(possible(y,x,n)){
            grid[y][x] = n;
            var solved = solve();
            if(solved) {
                return true;
            }
            grid[y][x] = 0;
          }
        }
        return false;
      }
    }
  }
  return true; // We didn't find any unsolved squares.
}

0
投票

您可以对Java脚本使用Google Chrome调试Click For SEE

例如,您可以在其中创建断点:Click For SEE

或设置监视变量:Click For SEE

要使用它请按F12并选择源并找到要调试的JS文件

© www.soinside.com 2019 - 2024. All rights reserved.