在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中文網其他相關文章!