在 Go 中生成所有可能的 N 字符密码
在 Python 中,可以使用 itertools.product() 函数生成所有可能的 N 字符密码固定长度的密码。例如,要使用字符 A-E 创建 2 个字符的密码,可以使用:
from itertools import product for permutation in product('ABCDE', repeat=2): print(permutation)
但是,在 Go 中,可以通过另一种方法来完成生成密码的任务:
所需的操作本质上是一个集合与其自身的 n 元笛卡尔积。例如,要创建所有 3 个字符的密码,我们需要 Prod(set,set,set)。这可以迭代地构建。
最初,我们创建 n-1 个产品,然后对于每个产品和原始集合的每个元素,我们附加该元素。让我们演示一下 2 个字符到 3 个字符的密码生成:
"ab" = {a,b} ->; {(a,a),(a,b),(b,a),(b,b)} -> {(a,a,a),(a,a,b),(a,b,a),(a,b,b),(b,a,a),(b,a,b),( b,b,a),(b,b,b)}
在 Go 中,我们可以将其实现为:
func NAryProduct(input string, n int) []string { if n <= 0 { return nil } prod := make([]string, len(input)) for i, char := range input { prod[i] = string(char) } for i := 1; i < n; i++ { next := make([]string, 0, len(input)*len(prod)) for _, word := range prod { for _, char := range input { next = append(next, word+string(char)) } } prod = next } return prod }
这个解决方案可以通过利用惰性求值进一步优化,减少记忆 用法。这是一个可供参考的游乐场链接:http://play.golang.org/p/6LhApeJ1bv
以上是如何在 Go 中生成所有可能的 N 字符密码?的详细内容。更多信息请关注PHP中文网其他相关文章!