最近要做一个密码本,列出所有电话号码的可能组合
也就是指定个数的数字的所有组合
比如(0, 1, 2) 列出这三个数字的任意组合,组合长度为3: 000,001,002,100,101,102.....
需要一个算法,特此记录
使用递归完成,随着可选数字的增多,需要的时间也大大增加,当需要11电话号码的所有组合,则有10的10次方,10000000000种可能,
(因为电话号码第一位为1),在我的个人电脑上,我计算大致需要34个小时才能跑完,写入文件中大致有200多G
后面要过滤(0,2,6,9)这几种可能,因为电话号码第二位不存在这几个数字,会减少不少数据
下面是go代码的算法实现
package main
func main() {
// 四位的所有组合
sli := []string{"3", "5", "7", "8"}
cast(sli, 0, "")
}
func cast(sli []string, s int, str string) {
if s != len(sli)-1 {
for i := 0; i < len(sli); i++ {
strtmp := str + sli[i]
cast(sli, s+1, strtmp)
}
} else {
for i := 0; i < len(sli); i++ {
println(str + sli[i])
}
}
}