2015-11-21 30 views
1

我有兩個轉到功能:類似轉到功能追加字符串和陣列不表現爲預期

func permutation(prefix, str []int) { 
    n := len(str) 
    if n == 0 { 
     fmt.Println(prefix) 
    } else { 
     for i := 0; i < n; i++ { 
      permutation(
       append(prefix, str[i]), 
       append(str[0:i], str[i+1:]...), 
      ) 
     } 
    } 
} 

func perms(prefix, str string) { 
    n := len(str) 
    if n == 0 { 
     fmt.Println(prefix) 
    } else { 
     for i := 0; i < n; i++ { 
      perms(
       prefix+string(str[i]), 
       string(str[0:i])+string(str[i+1:]), 
      ) 
     } 
    } 
} 

第一取整數數組,第二接受字符串。然後它們都計算數組的所有排列或字符串。

我可以像這樣運行它們:

permutation([]int{}, []int{1, 2, 3}) 
perms("", "123") 

他們的輸出是不一樣的:

$ go run main.go 
[1 2 3] 
[1 3 3] 
[3 3 3] 
[3 3 3] 
[3 3 3] 
[3 3 3] 
123 
132 
213 
231 
312 
321 

我想有一些細微差別追加,我很想念陣列。我似乎無法弄清楚。任何想法發生了什麼?

回答

2

雖然str1+str2確實返回新的(內存方面無關)​​字符串,append不會這樣做。例如,append(str[0:i], str[i+1:]...)將破壞str的原始內容,用str[i+1:]覆蓋str[i:]。這是因爲str[0:i]將有能力追加str[i+1:]而不分配新緩衝區。

解決方法是在每次迭代中創建一個全新的數組。至少str,因爲append(prefix, str[i])是免疫這個問題。例如:

for i := 0; i < n; i++ { 
    var s []int 
    s = append(s, str[0:i]...) 
    s = append(s, str[i+1:]...) 
    permutation(append(prefix, str[i]), s) 
} 

https://play.golang.org/p/lXwu39AA0V

更多關於切片和追加的機制:

http://blog.golang.org/go-slices-usage-and-internals

https://blog.golang.org/slices

相關問題