ios - Swift 在递归函数中没有返回正确的值
问题描述
我试图在 swift 中为数独求解器实现回溯解决方案。这是我的代码:
func solve(board: [[Int]]) -> (isSolved: Bool, board: [[Int]]){
var board = board
var empty_pos: (Int, Int)
var check_empty = findEmpty(board: board)
if check_empty.isEmpty == false{
return (true, board)
}else{
empty_pos = check_empty.pos
for num in 1..<10{
if isValid(board: board, num: num, pos: empty_pos){
board[empty_pos.0][empty_pos.1] = num
if solve(board: board).isSolved{
return (true, board)
}else{
board[empty_pos.0][empty_pos.1] = 0
}
}
}
}
return (false, board)}
当我运行代码时,该函数在原始板上返回 true。但是,当我在 ifsolved 块中打印板时,我注意到该函数解决了板,但它没有返回它,并继续调用该函数,直到它使所有 0 值再次变为 0。我认为该功能不会在 if solve(board: board).isSolved 部分中退出。我应该怎么做才能解决这个问题?谢谢!
解决方案
问题是您没有从 中返回修改后的返回值solve
,而只是丢弃它并返回局部变量board
。
您应该保存递归调用的返回值,如果其isSolved
属性为 true,board
则从递归调用返回 ,而不是本地 var。
func solve(board: [[Int]]) -> (isSolved: Bool, board: [[Int]]) {
var board = board
var emptyPos: (Int, Int)
var checkEmpty = findEmpty(board: board)
if !checkEmpty.isEmpty {
return (true, board)
} else {
emptyPos = checkEmpty.pos
for num in 1..<10 {
if isValid(board: board, num: num, pos: emptyPos){
board[emptyPos.0][emptyPos.1] = num
let solved = solve(board: board)
if solved.isSolved {
return (true, solved.board)
} else{
board[emptyPos.0][emptyPos.1] = 0
}
}
}
}
return (false, board)
}
与您的问题无关,但您应该遵守 Swift 命名约定,即变量和函数名称的 lowerCamelCase。
推荐阅读
- google-apps-script - 使用 Google 表格下拉菜单更改单元格背景颜色而不是文本
- vulkan - 如何在 Vulkan 中渲染到多个 3d 目标?
- javascript - 需要帮助在 HTML 表之间传输数据
- python - 这些模块中是否有任何功能或命令允许我读取 excel 数据,将其直接从 excel 转换为文本到 python?
- regex - 无法使用 pyperclip 和正则表达式来搜索模式?
- java - 如何在不更改 MySQL 架构的情况下在 Spring Boot 中扩展类?
- c# - 如何从 SQL 表达式返回 IQueryable?
- javascript - Javascript:如果选中并提交,则更改单选按钮的颜色
- javascript - 在 React 高阶组件中包含模态功能
- php - 有没有办法在插入时使用 sql 查询或 sql 触发器执行 PHP 页面或 URL?