笛卡尔积是数学中两个集合之间的运算,其结果是所有可能的有序对组合。形式上,给定两个集合 ( A ) 和 ( B ),它们的笛卡尔积 ( A \times B ) 定义为:
A×B={(a,b)∣a∈A,b∈B}
即,笛卡尔积中的元素是所有可能的由 ( A ) 中的元素和 ( B ) 中的元素组成的有序对。
运算规则
- 有序性:笛卡尔积中的元素是有序对,这意味着对 ((a, b)) 和 ((b, a)) 而言,如果 ( a \neq b ),那么 ((a, b) \neq (b, a))。
- 元素唯一性:每个有序对的元素来自各自的集合,不重复计算。
- 空集情况:若 ( A ) 或 ( B ) 中有一个为空集,则 ( A \times B = \emptyset )。
例子
例子1:
设 ( A = {1, 2} ) 和 ( B = {a, b, c} )。
那么,笛卡尔积 ( A \times B ) 为:
A×B={(1,a),(1,b),(1,c),(2,a),(2,b),(2,c)}
例子2:
设 ( A = {x, y} ) 和 ( B = \emptyset )。
那么,笛卡尔积 ( A \times B ) 为:
A×B=∅
因为 ( B ) 是空集,所以没有与 ( A ) 中元素配对的元素,结果也是空集。
例子3:
设 ( A = {1} ) 和 ( B = {2, 3} )。
那么,笛卡尔积 ( A \times B ) 为:
A×B={(1,2),(1,3)}
这些例子展示了笛卡尔积的基本计算方式和结果的形式。
go实现计算多个集合的笛卡尔积
示例调用
package main
import (
"fmt"
)
func Cartesian(sets ...[]any) [][]any {
length := func(i int) int { return len(sets[i]) }
nextIndex := func(ix []int, length func(idx int) int) {
for i := len(ix) - 1; i >= 0; i-- {
ix[i]++
if i == 0 || ix[i] < length(i) {
return
}
ix[i] = 0
}
}
var result [][]any
for ix := make([]int, len(sets)); ix[0] < length(0); nextIndex(ix, length) {
var r []any
for i, j := range ix {
r = append(r, sets[i][j])
}
result = append(result, r)
}
return result
}
func main() {
set1 := []any{1, 2}
set2 := []any{"a", "b", "c"}
set3 := []any{true, false}
result := Cartesian(set1, set2, set3)
for _, combo := range result {
fmt.Println(combo)
}
}
输出结果
[1 a true]
[1 a false]
[1 b true]
[1 b false]
[1 c true]
[1 c false]
[2 a true]
[2 a false]
[2 b true]
[2 b false]
[2 c true]
[2 c false]
在这个例子中,Cartesian
函数计算了集合 {1, 2}
、{"a", "b", "c"}
和 {true, false}
的笛卡尔积,返回了所有可能的组合。
代码解释
-
参数和返回值:
sets ...[]any
:可变参数,表示多个集合,每个集合是一个任意类型的切片。- 返回值
[][]any
:返回一个二维切片,每个元素是一个有序对的组合。
-
内部函数
length
:- 定义为
func(i int) int { return len(sets[i]) }
,用于获取第i
个集合的长度。
- 定义为
-
内部函数
nextIndex
:- 接受一个索引数组
ix
和一个获取长度的函数length
。 - 它的作用是将索引数组
ix
的元素逐一增加,以生成下一个组合。 - 如果当前索引超出集合长度,则重置当前索引并增加前一个集合的索引。
- 接受一个索引数组
-
主循环:
- 初始化索引数组
ix
,其长度与输入的集合数量相同,初始值为[0, 0, ..., 0]
。 - 使用
for
循环遍历所有可能的组合,直到第一个集合的所有元素都遍历完为止。 - 内循环
for i, j := range ix
用于构建当前组合r
。 - 将当前组合
r
添加到result
切片中。
- 初始化索引数组
-
返回结果:
- 返回包含所有可能组合的
result
。
- 返回包含所有可能组合的