Python类中Sudoku求解器报错:TypeError缺失必选位置参数
问题分析与解决方案
你遇到的错误根源很明确:错误地用类名调用了实例方法,没有通过当前实例(self)来触发方法,导致Python无法识别实例属性和必要参数。咱们一步步拆解问题并修复:
核心错误点
调用
possible方法时的问题:possible是实例方法,它需要访问当前实例的self.sudo属性。你用Sudoku.possible(i,j,nr)调用时,没有传入实例本身作为第一个参数(也就是self),所以Python报错缺少必要参数。递归调用
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
相关产品推荐
相关产品推荐

