FANDOM


Faktoriálist számolni a Pythonban igen egyszerű: csak meg kell hívni a math modul megfelelő függvényét. Ennek ellenére megírtam az iteratív és a rekurzív változatot is, mivel az iskolában ezek alapfeladatok. Szerencsére mind a három ugyanazt az eredményt adja. :-)

Már kész volt a program, amikor egy levelezőlista archívumában szembejött a rekurzív algoritmus tömörebb megvalósítása lambdafüggvénnyel, így azt is begyűjtöttem. Ez az érettségi szintjén túlmutató megoldás argumentum nélkül definiálja a RekFaktor2 függvényt, ugyanis itt függvények közötti értékadás történik.

A program két helyen mutatja be a kivételkezelést: először az adatbeolvasás ellenőrzésére (az int() ugyanis kivételt dob, ha nem egész számot, hanem törtet vagy szöveget vagy baglyot tartalmazó stringet akarunk konvertálni vele), másodszor a veremtúlcsordulást okozó rekurzió leállítására. A három eredmény ugyan egyforma, de a rekurzió a memória állapotától függően n=1000 környékén kifullad, és ilyenkor a program megszakadása miatt a másik két eredményt sem látnánk.

Sem az iteratív, sem a rekurzív megoldásban nem adtuk meg a visszaadott érték típusát; azt az értelmező dinamikusan állapítja meg, így – mivel az egész típusnak nincs méretkorlátja – a program meglepően nagy számok faktoriálisát is ki tudja számítani, csak győzzük elolvasni.

A program végén az if __name__=='__main__': sor ne riasszon el senkit, pusztán öncélú elegancia, hogy teljesen strukturált legyen a programunk. Ha csak az alatta levő két sort írnánk oda behúzás nélkül, ugyanígy működne. A magyarázata itt olvasható, célszerű és indokolt használatára pedig a bitmap.py modul mutat példát.

Ha valaki ékezetes függvényneveket vél fölfedezni, az nem optikai csalódás vagy nyomdahiba! A Python 3000 ezt is tudja. :-)

Check Tesztelve a 3.1.2 verzióban.

import math    #Ez csak a beépített faktoriálisfüggvény bemutatásához kell.

def szövegel():
    print("""Ez a program egy természetes szám faktoriálisát számítja ki
többféleképpen. A rekurzív algoritmus a tapasztalat szerint kb. 993-ig
működik; efelett "RuntimeError: maximum recursion depth exceeded in
comparison" hibaüzenettel áll le, de a határ a memória pillanatnyi hangulatától
is függ. Lehet kísérletezni, a hiba le van kezelve.\n""")

def beolvas():
    N=input('Kérek egy egész számot! ')    #string lesz!
    try:
        n=int(N)
    except ValueError:     #Nem egész szám, negatívvá tesszük
        n=-1
    print()
    return(n)

def RekFaktor(n):
    if n==0:
        return(1)
    else:
        return(RekFaktor(n-1)*n)

RekFaktor2 = lambda x: x*RekFaktor2(x-1) if x>1 else 1

def IterFaktor(n):
    f=1
    for i in range(n):  #Ez a [0;n-1] intervallum!
        f*=(i+1)
    return(f)

def kiír(n):
    if n<0:
        print('Ez bizony nem természetes szám.')
    else:
        try:
            print('%d! rekurzívan:              %d' % (n,RekFaktor(n)))
            print('%d! rekurzívan (lambda):     %d' % (n,RekFaktor2(n)))
        except RuntimeError:
            print('Túl nagy szám, a rekurzív számítást nem tudom elvégezni.')
        print("-"*79 if n>85 else"")    #Elválasztás az olvashatóság kedvéért
        print('%d! iteratívan:              %d' % (n,IterFaktor(n)))
        print("-"*79 if n>85 else"")
        print('%d! a beépített függvénnyel: %d' % (n,math.factorial(n)))
    
if __name__=='__main__':
    szövegel()
    kiír(beolvas())

Ez a szócikk forráskódot tartalmaz, amely egy WikiMedia-kiegészítés segítségével olyan színesen jeleníthető meg, mint például ebben a Wikipédia-cikkben. A kiegészítést a Wikia-stáb ígérete szerint 2010 végéig frissítik, addig türelmet kérünk a fapados kinézet miatt.

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

A Wikia-hálózat

Véletlen wiki