ios - Swift 在递归函数中不返回正确的值

标签 ios swift recursion backtracking sudoku

我尝试在 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 block 中打印棋盘时,我注意到该函数解决了棋盘问题,但它没有返回它,而是继续调用该函数,直到它再次使所有 0 值变为 0。我认为该函数不会在 ifsolve(board: board).isSolved 部分退出。我应该怎么做才能解决这个问题?谢谢!

最佳答案

问题是您没有从 solve 返回修改后的返回值,而只是丢弃它并返回局部变量 board

您应该保存递归调用的返回值,如果其 isSolved 属性为 true,则从递归调用返回 board,而不是本地变量。

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 命名约定,即变量和函数名称采用小驼峰命名法。

关于ios - Swift 在递归函数中不返回正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59426365/

相关文章:

ios - 彩色 UIImages 变得像素化

iphone - 是否需要 ARC 中的 NSNotificationCenter removeObserver?

generics - Swift 如何防止某些泛型重载,例如整数类型的 Range.subscript?

recursion - 如何使2个函数在OCaml中相互调用

带有嵌套字典的 Python 字典总和列表

ios - 适用于 iOS 的 Dropbox SDK 在模拟器上运行,而不是在实际设备上运行

iphone - 使用 UIImagePickerController 偷偷录制电影

ios - 我想使用非消耗品和自动更新那么,是否可以在一个应用程序中使用 2 个 IAP 产品?

ios - 仅在 UITableView 中将分隔符添加到第一个单元格

javascript - 我的 JavaScript 对象值重置函数失控了