为何已定义参数类型,Julia仍寻找不同参数类型的check函数?
解决Julia n皇后问题的MethodError问题
错误原因分析
你遇到的MethodError核心原因有两个:
- 参数类型不匹配:调用
solve(1, 6, falses(6, 6))时,传入的1和6是Julia默认的Int64类型,但check和solve函数定义中指定的参数类型是Int16。Julia会严格匹配函数方法的参数类型,找不到匹配的方法就会报错。 - 函数调用顺序错误:你的代码中先调用
solve,再定义check和solve函数。Julia是逐行执行的,执行到调用语句时函数还未定义,会导致无法找到正确的方法。
修正方案
1. 统一参数类型
将函数参数改为Int64(Julia默认整数类型,无需额外转换),或者调用时显式将整数转为Int16。推荐前者,更符合Julia的使用习惯。
2. 调整代码顺序
将函数定义放在调用语句之前,确保执行调用时函数已存在。
3. 修复其他潜在问题
- 定义
board变量,避免display(board)报错; - 修正
check函数中的索引越界问题,添加边界判断; - 移除
for循环中多余的column+=1(for循环会自动迭代column,手动修改会导致跳过元素); - 修正
check函数的逻辑判断:原代码中check返回true表示有冲突,但却在此时放置皇后,逻辑完全相反,需取反判断。
修正后的代码
function check(row::Int64, column::Int64, n::Int64, board::BitMatrix) # 检查同一列是否有皇后 for j in 1:row-1 if board[j, column] return true end end # 检查左上方对角线 j, k = row-1, column-1 while j >= 1 && k >= 1 if board[j, k] return true end j -= 1 k -= 1 end # 检查右上方对角线 j, k = row-1, column+1 while j >= 1 && k <= n if board[j, k] return true end j -= 1 k += 1 end return false end function solve(row::Int64, n::Int64, board::BitMatrix) if row > n return true end for column in 1:n if !check(row, column, n, board) board[row, column] = true if solve(row+1, n, board) return true end board[row, column] = false end end return false end # 调用函数 n = 6 board = falses(n, n) solve(1, n, board) display(board)
内容的提问来源于stack exchange,提问作者Another Person
相关产品推荐
相关产品推荐

