第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

附加字符串和數(shù)組的類似 Go 函數(shù)的行為與預(yù)期不符

附加字符串和數(shù)組的類似 Go 函數(shù)的行為與預(yù)期不符

Go
Qyouu 2021-11-22 18:33:35
我有兩個 Go 函數(shù):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:]),            )        }    }}第一個需要一個整數(shù)數(shù)組,第二個需要一個字符串。然后他們都計算數(shù)組或字符串的所有排列。我可以像這樣運(yùn)行它們: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]123132213231312321我想附加我缺少的數(shù)組有一些細(xì)微差別。我似乎無法弄清楚。知道發(fā)生了什么嗎?
查看完整描述

1 回答

?
慕田峪4524236

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個贊

雖然str1+str2確實(shí)返回了新的(與內(nèi)存無關(guān))字符串,append但不會以這種方式運(yùn)行。例如append(str[0:i], str[i+1:]...)會破壞原來的內(nèi)容str,覆蓋str[i:]用str[i+1:]。這是因?yàn)閟tr[0:i]將有能力追加str[i+1:]而不分配新的緩沖區(qū)。


解決方案是在每次迭代中創(chuàng)建一個全新的數(shù)組。至少對于str,因?yàn)閍ppend(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


有關(guān)切片和附加機(jī)制的更多信息:


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


https://blog.golang.org/slices


查看完整回答
反對 回復(fù) 2021-11-22
  • 1 回答
  • 0 關(guān)注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號