我正在尝试学习 Go,但我不明白为什么递归调用堆栈末尾的这段代码返回一个空 slice ,有帮助吗?此外,tmp
似乎甚至没有在调试器中注册。
func main() {
input := [3]int{4, 6, 7}
// expected [[6,7],[4,6,7],[4,6],[4,7]]
fmt.Println(findSubsequences(input))
}
func findSubsequences(nums [3]int) [][]int {
res := [][]int{}
list := []int{}
findSubsequence(res, list, nums, 0)
return res
}
func findSubsequence(res [][]int, list []int, nums [3]int, id int) [][]int {
if len(list) > 1 {
tmp := make([]int, len(list))
copy(tmp, list)
res = append(res, tmp)
}
var unique []int
for i := id; i < len(nums); i++ {
if id > 0 && nums[i] < nums[id-1] {
continue // skip non-increase
}
if contains(unique, nums[i]) {
continue // skip duplicate
}
unique = append(unique, nums[i])
list = append(list, nums[i])
findSubsequence(res, list, nums, id+1)
list = list[:len(list)-1]
}
return res
}
func contains(s []int, e int) bool {
for _, a := range s {
if a == e {
return true
}
}
return false
}
最佳答案
这是让您的代码附加 slice 的解决方案。在 GO 中,如果递归传递 slice ,则必须通过引用传递它。因此,这解决了您遇到的代码将返回空 slice 的问题。但是您的算法似乎不符合您期望的结果。
func main() {
input := [3]int{4, 6, 7}
// expected [[6,7],[4,6,7],[4,6],[4,7]]
fmt.Println(findSubsequences(input))
}
func findSubsequences(nums [3]int) [][]int {
res := [][]int{}
list := []int{}
fmt.Print(nums)
findSubsequence(&res, list, nums, 0)
return res
}
func findSubsequence(res *[][]int, list []int, nums [3]int, id int) [][]int {
var tmp []int
if len(list) > 1 {
tmp = make([]int, len(list))
copy(tmp, list)
fmt.Println(tmp)
*res = append(*res, tmp)
}
var unique []int
for i := id; i < len(nums); i++ {
if id > 0 && nums[i] < nums[id-1] {
continue // skip non-increase
}
if contains(unique, nums[i]) {
continue // skip duplicate
}
unique = append(unique, nums[i])
list = append(list, nums[i])
findSubsequence(res, list, nums, id+1)
list = list[:len(list)-1]
}
return *res
}
func contains(s []int, e int) bool {
for _, a := range s {
if a == e || a >e {
return true
}
}
return false
}
关于go - 递归附加到 slice 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45879903/