Portál AbcLinuxu, 13. května 2025 16:29
narazil jsem na problém a nevím jak se pohnout z místa :-/
K jedné úloze z teorie sítí potřebuju napsat funkci, která vrátí permutaci všech prvků seznamu, kterej se jí předá jako parametr. Ať jsem nad tím koumal jak chtěl, řešení vždycky vedlo k rekurzi. Problém nastane, pokud je seznam relativně velký. Program spadne na výjimku "RuntimeError: maximum recursion depth exceeded in cmp"
def permute(lst):
if lst == []:
return [[]]
else:
return [[el]+chunk for el in lst for chunk in permute([ x for x in lst if x != el])]
Dá se tý rekurzi nějak vyhnout nebo dá se spustit python s větším zásobníkem ?
Na druhou stranu ten kód už nevypadá tak elegantně, resp. zatím se mi nepodařilo přesně vyčíst ten algoritmus. Nebyla by nějaká jednodušší verze ? Já vím, to už chci moc
Ok, na to generování podle pořadového čísla se juknu. Díky.
def permute(lst): if not lst: yield [] else: for item in lst: for chunk in permute([x for x in lst if x != item]): yield [item] + chunkAk by som mal tento program vylepsovat, tak by som ho prepisal tak, aby nevratil iterovany zoznam zoznamov, ale iterovany zoznam toho co dostal na vstupe (cize ak agrumentom bude string - vratil by zoznam stringov, ak tuple, zoznam tuplov...)
$ cat permutations.py #! /usr/bin/env python3 import sys import itertools for item in itertools.permutations(sys.argv[1:]): print("".join(item)) $ ./permutations.py A B C ABC ACB BAC BCA CAB CBA
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.