Нет необходимости в указателе на срез, так как срезы сами являются указателями.«срез - это ссылка на непрерывный сегмент массива.», reference .
Странное поведение, которое вы видите, это то, что вы используете append, когда срез выходит за пределыего емкость требуется для создания нового среза с увеличенной емкостью и копирования всего содержимого оригинального (это то, что приложение добавляет за кулисами), следовательно, новый срез больше не указывает на исходный базовый массив.
Вместо того, чтобы изменять входящий параметр, я предлагаю вернуть срез в качестве возвращаемого значения для функции.
func permute(nums []int) [][]int {
res := permuteHlp(nums, 0, new([]int))
return res
}
Рекомендую прочитать сообщение в блоге на golang.org о внутренних фрагментах, здесь
Редактировать:
Я добавляю рефакторинг, взяв алгоритм из этот ответ .
package main
import (
"fmt"
)
func permutations(arr []int)[][]int{
var helper func([]int, int)
res := [][]int{}
helper = func(arr []int, n int){
if n == 1{
tmp := make([]int, len(arr))
copy(tmp, arr)
res = append(res, tmp)
} else {
for i := 0; i < n; i++{
helper(arr, n - 1)
if n % 2 == 1{
tmp := arr[i]
arr[i] = arr[n - 1]
arr[n - 1] = tmp
} else {
tmp := arr[0]
arr[0] = arr[n - 1]
arr[n - 1] = tmp
}
}
}
}
helper(arr, len(arr))
return res
}
func main() {
x := []int{1,2,3,4}
d := permutations(x)
fmt.Print(d)
}
Обычно вы выиграли 'Если вы не хотите иметь указатель на фрагмент, вместо этого возвращайте новый из функции, еще одну вещь для комментирования, старайтесь не использовать рекурсию, если это возможно, поскольку golang не имеет оптимизации хвостового вызова,д его петли работают удивительно.Надеюсь, это поможет!