优雅的递归算法(二)交叉合并
Preface 将两个切片按指定批次大小交替合并, 参数 batch 表示每次从切片取出元素个数。 常规实现(迭代) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // mergeSlicesByBatch 将两个切片按指定批次大小交替合并 // 参数 batch 表示每次从切片取出元素个数 func mergeSlicesByBatch[T any](s1, s2 []T, batch int) []T { merged := make([]T, 0, len(s1)+len(s2)) // 提取指定批次的元素 mergeTopN := func(slice []T, begin, batch int) int { end := begin + batch if end > len(slice) { end = len(slice) } if begin < end { merged = append(merged, slice[begin:end]...) begin = end } return begin } for i, j := 0, 0; i < len(s1) || j < len(s2); { i = mergeTopN(s1, i, batch) j = mergeTopN(s2, j, batch) } return merged } 递归实现 1 2 3 4 5 6 7 8 9 10 11 12 13 func crossMerge[T any](s1, s2 []T, batch int) []T { // s1长度<=N,直接合并 if len(s1) <= batch { return slices.Concat(s1, s2) } // s2长度<……