def all_perms(str):
# If there is only one item, there can be only one permutation
# yield the single item
if len(str) <=1:
yield str
else:
# loop over the permutations returned by a recursive call to all_perms
# note it is passing a subset of the list passed in.
for perm in all_perms(str[1:]):
# for each returned sub-permutation insert the item that
# wasn't passed into each possible position.
for i in range(len(perm)+1):
yield perm[:i] + str[0:1] + perm[i:]
for p in all_perms(['a','b','c']):
print p
Итак, вы переходите в ['a','b','c']
.
Он вызывает all_perms(['b', 'c'])
, и это вызывает all_perms(['c'])
, что приводит к 'c'.
оператор yield
означает, что all_perms()
является генератором тот факт, что он вызывает сам себя, означает, что он использует рекурсию .
Я бы рекомендовал использовать itertools.permutations вместо этого фрагмента.