典型的方法是将非可变状态传递给调用堆栈,辅助函数将当前状态返回到新的状态为"伪"突变.
一个可能的(虽然相当次优)数独求解器将是:
;;; Use a list of 81 integers to represent a sudoku board,
;;; each number 1-9 represents itself, 0 represents a blank
(defun sudoku-solver (board)
(cond ((notany #'zerop board)
(if (sudoku-solved-p board)
board
nil))
(t (let ((positions (sudoku-all-blanks board)))
(loop for position in positions
do (loop for number in '(1 2 3 4 5 6 7 8 9)
do (let ((result (sudoku-solver
(sudoku-set board
position
number))))
(when result
(return-from sudoku-solver result)))))))))
Run Code Online (Sandbox Code Playgroud)
这将自动回溯,直到找到解决方案.我已经跳过了使用支持代码来模糊演示,该代码将它从演示变为实际工作代码.