9

一連の要素のすべての一意の順列を返す次の関数を検討してください。

def get_permutations(elements):
    if len(elements) == 0:
        yield ()
    else:
        unique_elements = set(elements)
        for first_element in unique_elements:
            remaining_elements = list(elements)
            remaining_elements.remove(first_element)
            for subpermutation in get_permutations(tuple(remaining_elements)):
                yield (first_element,) + subpermutation

for permutation in get_permutations((1, 1, 2)):
    print(permutation)

これは印刷します

(1, 1, 2)
(1, 2, 1)
(2, 1, 1)

予想通り。ただし、関数をメモ化するlru_cacheデコレータを追加すると、次のようになります。

import functools

@functools.lru_cache(maxsize=None)
def get_permutations(elements):
    if len(elements) == 0:
        yield ()
    else:
        unique_elements = set(elements)
        for first_element in unique_elements:
            remaining_elements = list(elements)
            remaining_elements.remove(first_element)
            for subpermutation in get_permutations(tuple(remaining_elements)):
                yield (first_element,) + subpermutation

for permutation in get_permutations((1, 1, 2)):
    print(permutation)

次のように出力します。

(1, 1, 2)

最初の順列のみを出力するのはなぜですか?

4

1 に答える 1