回溯

pardon110發表於2020-09-01

雜談

遞迴具有確定性,遞進,有降維打擊的意味
回溯 類似回退,嘗試當初的另一個分支,某種程度上擴維選擇,條件剪枝

示例

var rs [][]int
var tmp []int

func huiso(curIndex int, nums []int) {
    if curIndex == len(nums) {
        if len(tmp) <= len(nums) && len(tmp) > 0 {
            cp := make([]int, len(tmp))
            copy(cp, tmp)
            rs = append(rs, cp)
        }
        return
    }
    tmp = append(tmp, nums[curIndex])
    // 遞進
    huiso(curIndex+1, nums)
    tmp = tmp[:len(tmp)-1]
    // 回溯
    huiso(curIndex+1, nums)
}

測試

func main() {
    t := []int{1, 2, 3, 4}
    huiso(0, t)
    fmt.Print(rs)
    // [[1 2 3 4] [1 2 3] [1 2 4] [1 2] [1 3 4] [1 3] [1 4] [1] [2 3 4] [2 3] [2 4] [2] [3 4] [3] [4]]
}

中序遍歷

func inorderTraversal(root *TreeNode) []int {
    if root == nil{
        return nil
    }
    l := []int{}
    if root.Left != nil {
        l = inorderTraversal(root.Left)
    }
    l = append(l,root.Val)
    if root.Right !=nil{
       l= append(l, inorderTraversal(root.Right)...)
    }
    return l
}

小結

  • 遞迴在回溯期會自動恢復上下文,最內層條件終止,並不意味程式停止執行,會層層回退,層層恢復,直到最外層。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章