JavaScriptで再帰を使用して有効なSudokuボードを生成するには、「分割と征服」アプローチに従って、以前に配置された値に関して新しい値が検証されている各値を1つずつ埋めることができます。ボードで。以下は、有効なSudokuボードを生成するために使用できる基本的なアルゴリズムです。

    再帰関数を定義して、有効なSudokuボードを生成します。関数は、現在の列と機能している現在の列を受け入れる必要があります。

    ボードの終わりに到達したかどうか、つまり現在の行が9に等しく、現在の列が0に等しいかどうかを確認します。その場合、ボードは完全かつ有効であり、生成されたボードを返す必要があります。

    現在の列が0に等しいかどうかを確認します。その場合、次の行に移動して、最初の列から開始します。

    1〜9の間の乱数を生成して、現在の位置に配置します。

    生成された数が現在の位置に配置するのに有効であるかどうか、つまり、同じ行、列、または3x3の正方形に他の等しい数がないかどうかを確認します。

    数値が有効な場合は、現在の位置に配置し、同じ行の次の位置のために関数を再帰的に呼び出します。

    数値が有効でない場合は、ステップ4に戻り、新しい乱数を生成します。

    再帰関数が有効なボードを返す場合は、ボードを返します。

以下は、JavaScriptでのこのアルゴリズムの実装の可能性です。

SCSS

関数GeneRARTABLLEROSUDOKU（）{
  Consta Board = [];

  //ゼロでボードを初期化します
  for（i = 0; i <9; i ++）{
    ボード[i] = new Array（9）.fill（0）;
  }

  //ボードを埋めるための再帰関数
  フルフィリング（行、列）{
    //ボードの端に到達した場合、生成されたボードを返します
    if（row === 9 && column === 0）{
      返品ボード。
    }

    //行の端に到達した場合は、次の行に移動して、最初の列から開始します
    if（column === 9）{
      return fillable（row + 1、0）;
    }

    //現在の位置に配置するために1〜9の間の乱数を生成します
    let num = math.floor（math.random（） * 9） + 1;

    //生成された数が有効かどうかを確認します
    while（！esvalid（board、row、column、num））{
      num = math.floor（math.random（） * 9） + 1;
    }

    //番号を現在の位置に配置します
    ボード[row] [column] = num;

    //同じ行の次の位置のために関数を再帰的に呼び出す
    return fillable（行、列 + 1）;
  }

  //現在の位置で数値が有効かどうかを確認する機能
  esvalid関数（ボード、row、列、num）{
    //同じ行に番号が既に存在するかどうかを確認します
    for（i = 0; i <9; i ++）{
      if（ボード
Para generar un tablero válido de Sudoku usando recursividad en JavaScript, se puede seguir un enfoque de "dividir y conquistar" para llenar el tablero con valores válidos uno por uno, en el que cada valor nuevo se valida con respecto a los valores previamente colocados en el tablero. A continuación se muestra un algoritmo básico que se puede utilizar para generar un tablero de Sudoku válido:

    Definir una función recursiva para generar un tablero de Sudoku válido. La función deberá aceptar como argumentos la fila y la columna actual en las que se encuentra trabajando.

    Comprobar si se ha alcanzado el final del tablero, es decir, si la fila actual es igual a 9 y la columna actual es igual a 0. En ese caso, el tablero está completo y válido, y se debe devolver el tablero generado.

    Comprobar si la columna actual es igual a 0. En ese caso, pasar a la siguiente fila y comenzar en la primera columna.

    Generar un número aleatorio entre 1 y 9 para colocar en la posición actual.

    Comprobar si el número generado es válido para colocar en la posición actual, es decir, si no existe otro número igual en la misma fila, columna o cuadrado de 3x3.

    Si el número es válido, colocarlo en la posición actual y llamar a la función recursivamente para la siguiente posición en la misma fila.

    Si el número no es válido, volver al paso 4 y generar un nuevo número aleatorio.

    Si la función recursiva devuelve un tablero válido, devolver el tablero.

A continuación se muestra una posible implementación de este algoritmo en JavaScript:

scss

function generarTableroSudoku() {
  const tablero = [];

  // inicializar el tablero con ceros
  for (let i = 0; i < 9; i++) {
    tablero[i] = new Array(9).fill(0);
  }

  // función recursiva para llenar el tablero
  function llenarTablero(fila, columna) {
    // si se alcanza el final del tablero, devolver el tablero generado
    if (fila === 9 && columna === 0) {
      return tablero;
    }

    // si se alcanza el final de la fila, pasar a la siguiente fila y comenzar en la primera columna
    if (columna === 9) {
      return llenarTablero(fila + 1, 0);
    }

    // generar un número aleatorio entre 1 y 9 para colocar en la posición actual
    let num = Math.floor(Math.random() * 9) + 1;

    // comprobar si el número generado es válido
    while (!esValido(tablero, fila, columna, num)) {
      num = Math.floor(Math.random() * 9) + 1;
    }

    // colocar el número en la posición actual
    tablero[fila][columna] = num;

    // llamar a la función recursivamente para la siguiente posición en la misma fila
    return llenarTablero(fila, columna + 1);
  }

  // función para comprobar si un número es válido en la posición actual
  function esValido(tablero, fila, columna, num) {
    // comprobar si el número ya existe en la misma fila
    for (let i = 0; i < 9; i++) {
      if (tablero