Portál AbcLinuxu, 4. prosince 2025 12:08
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 
. Ale každopádně jde o built-in modul v C, nic efektivnějšího už v Pythonu nenajdeš.
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] + chunk
Ak 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.