雜談
遞迴具有確定性,遞進,有降維打擊的意味
回溯 類似回退,嘗試當初的另一個分支,某種程度上擴維選擇,條件剪枝
示例
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 協議》,轉載必須註明作者和本文連結