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

Python数独求解函数末尾返回None,如何定位问题并移除多余返回值

问题根因

你最终输出None和添加exit没有关系,核心是三处代码逻辑错误:

  • 顶层sudoku_solver函数没有显式返回值:你在函数内调用了solution求解,但没有用return语句把求解结果返回,Python中所有没有显式指定返回值的函数,默认返回None,这是你打印your_solution得到None的直接原因。
  • 递归回溯逻辑未承接有效解:solution函数中递归调用自身后,没有判断是否已经找到合法解,就算某条递归分支找到了正确的数独矩阵,也会被后续的sudoku[y][x] = 0回滚操作清空,且不会将正确结果向上层调用返回。
  • 初始重复校验逻辑失效:你调用了duplicates函数检测初始数独是否存在重复值,但没有接收它的返回值,就算检测到非法输入,也不会触发返回-1矩阵的逻辑。
修正后代码
import numpy as np
import copy

# 补充原代码中缺失的possible函数逻辑,功能为判断坐标(y,x)是否可填入数值n
def possible(y, x, n, sudoku):
    # 行校验
    for i in range(9):
        if sudoku[y][i] == n:
            return False
    # 列校验
    for i in range(9):
        if sudoku[i][x] == n:
            return False
    # 3*3宫格校验
    x0 = (x//3)*3
    y0 = (y//3)*3
    for i in range(3):
        for j in range(3):
            if sudoku[y0+i][x0+j] == n:
                return False
    return True

def sudoku_solver(sudoku):
    start_sudoku = copy.deepcopy(sudoku)
    # 接收重复校验结果
    dup_check = duplicates(sudoku)
    if dup_check is not None:
        return dup_check
    # 返回求解结果
    return solution(start_sudoku, sudoku)

def duplicates(sudoku):
    for r in range(9):
        line = (sudoku[r, :])
        nonzeros = [x for x in line.flatten() if x != 0]
        if len(nonzeros) != len(set(nonzeros)):
            array = [[-1 for i in range(9)] for j in range(9)]
            return np.array(array)
    return None

def solution(start_sudoku, sudoku):
    for y in range(9): 
        for x in range(9): 
            if sudoku[y][x] == 0:
                for n in range(1, 10): 
                    if possible(y, x, n, sudoku):
                        sudoku[y][x] = n
                        # 承接递归返回的解,找到有效解直接向上返回
                        res = solution(start_sudoku, sudoku)
                        if res is not None:
                            return res
                        sudoku[y][x] = 0 
                # 所有取值都试完无解,返回None
                return None
    if np.array_equal(sudoku, start_sudoku):
        array = [[-1 for i in range(9)] for j in range(9)]
        return np.array(array)
    return sudoku

# 测试用例,可替换为你自己的输入数独
sudoku = np.array([
    [0,4,5,3,2,8,7,1,9],
    [3,8,7,9,1,6,4,5,2],
    [2,9,1,4,5,7,6,3,8],
    [5,6,3,2,9,1,8,7,4],
    [9,7,8,6,4,5,1,2,3],
    [1,2,4,8,7,3,5,9,6],
    [7,3,9,5,6,4,2,8,1],
    [8,5,6,1,3,2,9,4,7],
    [4,1,2,7,8,9,3,6,5]
])
your_solution = sudoku_solver(sudoku)
print(your_solution)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:06:01