能否使用Go语言slice解包特性简化布尔列表全排列生成函数?
结论
可以通过Go的slice解包特性大幅简化permutations函数,核心是利用append的可变参数解包语法append(slice, elements...)替代原代码中冗余的内层遍历拼接逻辑。
简化方案
原代码中为了在每个子排列头部拼接true/false,额外写了一层内层for循环逐个追加子排列的元素,这部分逻辑可以用slice解包一步完成,简化后的完整实现如下:
package main import "fmt" func permutations(m int) [][]bool { if m == 0 { panic("CRASH") } if m == 1 { return [][]bool{{true}, {false}} } retVal := [][]bool{} for _, x := range permutations(m - 1) { // x... 就是slice解包语法,直接将x的所有元素展开追加到新切片 retVal = append(retVal, append([]bool{true}, x...)) retVal = append(retVal, append([]bool{false}, x...)) } return retVal } func main() { fmt.Println("Hello, playground") m := permutations(3) fmt.Println("m = ", m) }
效果说明
简化后的实现和原逻辑完全等价,输出结果一致,没有额外性能开销,仅去掉了冗余的内层循环代码,可读性更高。
内容的提问来源于stack exchange,提问作者Saqib Ali
相关产品推荐
相关产品推荐

