排列组合(密码本)-求指定个数的字母或数字的的任意排列组合

最近要做一个密码本,列出所有电话号码的可能组合

也就是指定个数的数字的所有组合

比如(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])
		}

	}
}

 

    原文作者:dalgurak
    原文地址: https://blog.csdn.net/itpika/article/details/105538923
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞