Rekurze – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rekurze – Python – Fórum – Programujte.comRekurze – Python – Fórum – Programujte.com

 

CML0
Duch
16. 6. 2008   #1
-
0
-

Snažím se vytvořit funkci, která zapíše do souboru všechny kombinace zadaných písmen o zadané délce. Zatím mám tohle:

def men(pozice,pismeno,ret):

ret2=""
for i in range(pozice):
ret2=ret2+ret[i]
ret2=ret2+pismeno
for i in range(pozice+1,len(ret)):
ret2=ret2+ret[i]
return ret2

def kombinace(soubor,nabidka,delka=None,ret=None,menim=None):
if ret==None: ret=nabidka[0]*delka; soubor.write(ret+"\n")
if menim==None: menim=len(ret)-1
try:
ret=men(menim,nabidka[nabidka.find(ret[menim])+1],ret)
soubor.write(ret+"\n")
kombinace(soubor,nabidka,ret=ret)
except IndexError:
if menim!=0:
kombinace(soubor,nabidka,ret=men(menim,nabidka[0],ret),menim=menim-1)
else:
print "Hotovo!"


Funkce men mění v řetězci ret znak na pozici pozice na znak pismeno.

Funkce kombinace změní podle nabídky poslední znak a zavolá sama sebe znovu. Tohle opakuje dokud nedojde k poslednímu znaku z nabídky. Pak zavolá znovu sama sebe, ale přidá i argument menim, který zmení písmeno na pozici o jednu blíž (předposlední). A celé se to opakuje.

Doufám, že jste aspoň trochu pochopili, jak to má fungovat... :smile14:

Problém je v tom, že pokud zadám hodně velkou nabídku nebo délku nastane moc velký počet rekurzí a program se přeruší. Nevím, jak se tomu mám vyhnout. :smile10:

Jinak nejsem v programování nějak moc zběhlá, takže omluvte naprostou neeleganci a složitost kódu:)

Nahlásit jako SPAM
IP: 89.102.174.–
Tchibo0
Návštěvník
16. 6. 2008   #2
-
0
-

Ahoj, musi to byt rekurze ??

Nahlásit jako SPAM
IP: 85.70.215.–
Tchibo
Architekt0
Super člen
16. 6. 2008   #3
-
0
-

To CML : Jsou dvě možnosti. Buď je to tím, že ten tvůj kód vypadá tak prasácky, že se mi ho ani nechce luštit :-) a tím pádem by tam mohla být nějaká chyba, kvůli které se ti tam něco zacyklí. Nebo jsi zkusila vygenerovat až příliš mnoho kombinací a nevešlo se ti to na disk.

Nicméně pěkně "čistý" program s použitím rekurze by měl vypadat takto:



#!/usr/bin/env python
# -*- coding: utf-8 -*-

def kombinuj(soubor, hodnoty, hash, delka):
for pismeno in hodnoty:
novyHash = hash + pismeno
if delka > 0:
kombinuj(soubor, hodnoty, novyHash, delka - 1)
else:
soubor.write("%s\n" % (novyHash))
return True

if __name__ == "__main__":
soubor = open('temp.txt', 'w')
hodnoty = "abcdefgh"
delka = 8

kombinuj(soubor, hodnoty, "", delka - 1)

soubor.close()

Tady není důvod, proč by se to mělo seknout. Jedinej problém může být velikost vygenerovaného souboru, a to že to nezvládne filesystém, nebo místo na disku. Kdyžtak před to zavolání funkce kombinuj() přidej:
    print "Vygeneruji %.3fkB!" % (len(hodnoty) ** delka * (delka+1) / 1024.0)

a hned budeš vědět, co tě čeká. Ten příklad nahoře vygeneruje necelých 150MB. Jsem si to prvně neuvědomil a pustil jsem tam vygenerovat 16-ti znaková slova z 16-ti písmen, což je soubor o velikosti 285 miliónů terabajtů :-)

Nahlásit jako SPAM
IP: 213.192.22.–
Python + Django + PostgeSQL = spokojený vývojář :-)
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 17 hostů

Podobná vlákna

Rekurze — založil NevimCoSemVyplnit

Rekurze — založil johny

Nalezení rekurze — založil sh00ter

Rekurze SPĚCHÁ — založil Hanmir1

Rekurze vs zasobnik — založil fitness

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý