Tengo un problema al devolver una cadena que mapea el camino tomado para llegar al final de un laberinto. La función toma un laberinto de matriz bidimensional de valores de cadena y una matriz de 2 elementos que representan el punto de inicio del laberinto (por ejemplo, [0,0]). Estoy devolviendo la ruta correcta cuando se llama a la función una vez, pero la cadena no se reinicia, por lo que obtengo varias respuestas concatenadas. Código:
function mazeSolver(maze, index = [0, 0]) { if (typeof mazeSolver.answer == "undefined") { mazeSolver.answer = ""; } const pointer = () => maze[index[0]][index[1]]; if (index[1] < maze[0].length - 1) { index[1] += 1; if (pointer() === " " || pointer() === "e") { mazeSolver.answer += "R"; if (pointer() === "e") return mazeSolver.answer; return mazeSolver(maze, index); } else { if (index[0] < maze.length - 1) { index[1] -= 1; index[0] += 1; if (pointer() === " " || pointer() === "e") { mazeSolver.answer += "D"; if (pointer() === "e") return mazeSolver.answer; return mazeSolver(maze, index); } } } } else if (index[0] < maze.length - 1) { index[0] += 1; if (pointer() === " " || pointer() === "e") { mazeSolver.answer += "D"; if (pointer() === "e") return mazeSolver.answer; return mazeSolver(maze, index); } } } const mySmallMaze = [ [" ", "*", " "], [" ", "*", " "], [" ", " ", "e"], ]; console.log(mazeSolver(mySmallMaze));registros: "DDRR" en la segunda llamada: "DDRRDDRR"
Una forma de resolver esto, sin dejar de usar su enfoque mazeSolver.answer , es pasar un parámetro adicional que rastrea si estamos en una llamada recursiva o no. Si no, reseteamos la respuesta:
function mazeSolver(maze, index = [0, 0], top_level_call = true) { if (top_level_call) { mazeSolver.answer = ""; } const pointer = () => maze[index[0]][index[1]]; if (index[1] < maze[0].length - 1) { index[1] += 1; if (pointer() === " " || pointer() === "e") { mazeSolver.answer += "R"; if (pointer() === "e") return mazeSolver.answer; return mazeSolver(maze, index, false); } else { if (index[0] < maze.length - 1) { index[1] -= 1; index[0] += 1; if (pointer() === " " || pointer() === "e") { mazeSolver.answer += "D"; if (pointer() === "e") return mazeSolver.answer; return mazeSolver(maze, index, false); } } } } else if (index[0] < maze.length - 1) { index[0] += 1; if (pointer() === " " || pointer() === "e") { mazeSolver.answer += "D"; if (pointer() === "e") return mazeSolver.answer; return mazeSolver(maze, index, false); } } } const mySmallMaze = [ [" ", "*", " "], [" ", "*", " "], [" ", " ", "e"], ]; console.log(mazeSolver(mySmallMaze));Dicho esto, un enfoque más común y estándar sería simplemente pasar la respuesta como un parámetro de método:
function mazeSolver(maze, index = [0, 0], answer = "") { ... answer += "R"; ... return mazeSolver(maze, index, answer); ... return answer }Hay al menos un par de razones para preferir el segundo enfoque:
mazeSolver a otra variable: let solver = mazeSolver . Ahora el solver está almacenando datos en mazeSolver , lo cual es desordenado y contradictorio.