You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数独回溯递归求解代码核心执行逻辑疑问,含测试用例与运行结果

数独回溯算法核心逻辑解答

核心逻辑基础

你贴的这段代码是典型的回溯法实现数独求解,核心思路是:逐个查找空单元格(值为0),从小到大试填1-9的合法数字,填完后递归处理后续的空单元格,如果后续路径走不通就撤销当前填数,试下一个可能的数字,直到所有单元格都填满合法值。


疑问解答

1. board[row][col] = 0的执行时机

这行是回溯撤销操作,执行场景如下:
当你给当前单元格填了一个合法数字后,递归调用的solve(board)执行完毕(意味着后续所有空单元格的所有可能组合都已经尝试过,且没有找到可行解),程序回到当前递归层,就会执行这行代码把当前单元格恢复为空,继续试下一个可能的数字。
举个对应你测试用例的实际例子:第一个空单元格是第0行第1位,你先试填1,递归处理后面的格子时发现无论怎么填都有冲突,递归函数返回后,就会执行这行代码把第一个格子改回0,接着试填2。

2. 无合法数字时的执行逻辑

你的理解完全正确:
当遍历完1-9所有数字,要么不符合is_valid的校验规则,要么填完后递归走不通,整个for num in range(1,10)循环执行完毕后,就会走到return False的逻辑,退出当前层的递归函数,回到上一层递归继续尝试其他数字。


补充说明

你贴的原代码缺少了找到完整解后的终止逻辑:当遍历完所有单元格都没有找到0时,说明数独已经解完,需要加一行return True,同时递归调用solve(board)后要判断返回值,如果返回True就直接退出,避免不必要的回溯。补充后的solve函数逻辑如下:

def solve(board):
    for row in range(9):
        for col in range(9):
            if board[row][col] == 0:
                for num in range(1,10):
                    if is_valid(board, row, col, num):
                        board[row][col] = num
                        if solve(board): # 找到解直接返回,不回溯
                            return True
                        board[row][col] = 0
                return False
    return True # 所有格子填满,找到解

内容的提问来源于stack exchange,提问作者abdurion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:39:04