primitive password cracker

Chris Angelico rosuav at gmail.com
Thu Jan 7 19:39:16 EST 2021


On Fri, Jan 8, 2021 at 11:31 AM Greg Ewing <greg.ewing at canterbury.ac.nz> wrote:
>
> Another way to approach this problem is using recursion, e.g.
>
> def find_combinations(items, n, comb, result):
>    if n == 0:
>      result.append(comb)
>    else:
>      for item in items:
>        find_combinations(items, n - 1, comb + [item], result)
>
> words = []
> find_combinations(['a', 'b', 'c'], 3, [], words)
> print(words)
>

True, but I'd much rather write it as a generator:

def permute(items, n):
    if not n:
        yield ""
        return
    # Optional performance enhancement:
    if n == 1: return (yield from items)
    for item in items:
        for rest in permute(items, n - 1):
            yield item + rest

words = list(permute("abc", 3))

I'm not sure how performance would go, but this is a lot cleaner.

ChrisA


More information about the Python-list mailing list