通常,当您发现自己需要无限多的嵌套循环时,应该编写一个递归函数。下面是一个作为生成器函数的实现:
def generate_strings(letters, transitions, k):
def helper(s):
if len(s) == k:
yield s
elif len(s) < k:
for letter in transitions[s[-1]]:
yield from helper(s + letter)
for letter in letters:
yield from helper(letter)
示例:请注意,不必使用字符列表,因为字符串也是一个字符序列。
>>> letters = 'abcd'
>>> transitions = {'a': 'bc', 'b': 'a', 'c': 'd', 'd': 'bcd'}
>>> for s in generate_strings(letters, transitions, 4):
... print(s)
...
abab
abac
acdb
acdc
acdd
baba
bacd
cdba
cdcd
cddb
cddc
cddd
dbab
dbac
dcdb
dcdc
dcdd
ddba
ddcd
dddb
dddc
dddd