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

Python类中Sudoku求解器报错:TypeError缺失必选位置参数

问题分析与解决方案

你遇到的错误根源很明确:错误地用类名调用了实例方法,没有通过当前实例(self)来触发方法,导致Python无法识别实例属性和必要参数。咱们一步步拆解问题并修复:

核心错误点

  1. 调用possible方法时的问题:
    possible是实例方法,它需要访问当前实例的self.sudo属性。你用Sudoku.possible(i,j,nr)调用时,没有传入实例本身作为第一个参数(也就是self),所以Python报错缺少必要参数。

  2. 递归调用solve方法时的问题:
    同理,solve也是实例方法,递归时应该调用当前实例的solve方法,而不是直接用类名调用Sudoku.solve()——这同样会因为缺少self参数导致执行失败。

修正后的完整代码

import numpy as np

# 假设数独以np.array导入,空白处替换为0
class Sudoku():
    solution_number = 1
    def __init__ (self, sud_arr):
        self.sudo = sud_arr
        # print(self.sudo)
    
    def possible (self, y, x, num):
        for i in range(9):
            if self.sudo[y][i] == num:
                return False
            if self.sudo[i][x] == num:
                return False
        yy = (y//3)*3
        xx = (x//3)*3
        for i in range(3):
            for j in range(3):
                if self.sudo[yy+i][xx+j] == num:
                    return False
        return True
    
    def solve(self):
        for i in range(9):
            for j in range(9):
                if self.sudo[i][j] == 0:
                    for nr in range(1,10):
                        # 修正:用self调用possible实例方法
                        if self.possible(i,j,nr): 
                            self.sudo[i][j] = nr
                            # 修正:用self递归调用solve实例方法
                            self.solve()
                            self.sudo[i][j] = 0
                    return
        if Sudoku.solution_number > 1: # 若存在多个解,显示解编号
            print("Solution Number {}".format(Sudoku.solution_number))
        else:
            print("Solution Number 1")
        print(self.sudo)
        Sudoku.add_sol_num()
    
    @classmethod
    def add_sol_num(cls):
        cls.solution_number += 1

额外说明

  • 关于类变量solution_number:你用@classmethod修改它的方式是正确的,因为这个变量属于整个Sudoku类而非单个实例。调用Sudoku.add_sol_num()或者self.add_sol_num()都可以,效果完全一致。
  • 测试示例:确保你的su是9x9的numpy数组,空白处用0填充,比如:
    su = np.array([
        [5,3,0,0,7,0,0,0,0],
        [6,0,0,1,9,5,0,0,0],
        [0,9,8,0,0,0,0,6,0],
        [8,0,0,0,6,0,0,0,3],
        [4,0,0,8,0,3,0,0,1],
        [7,0,0,0,2,0,0,0,6],
        [0,6,0,0,0,0,2,8,0],
        [0,0,0,4,1,9,0,0,5],
        [0,0,0,0,8,0,0,7,9]
    ])
    s = Sudoku(su)
    s.solve()
    

修改后代码就能正常运行,正确求解数独并输出所有解了。

内容的提问来源于stack exchange,提问作者George van Heerden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:03:13