Az Ackermann függvény egy egyszerű példa egy mindenhol definiált kiszámítható függvényre , amely nem primitív rekurzív . Két nem negatív egész számot vesz paraméterként, és egy természetes számot ad vissza , amelyet jelöl . Ez a függvény nagyon gyorsan növekszik, például a szám olyan nagy, hogy a számsorrendben lévő számjegyek száma sokszorosa az Univerzum megfigyelhető részében lévő atomok számának .
Az 1920-as évek végén David Hilbert matematikusai , Gabriel Sudan és Wilhelm Ackermann a számítástechnika alapjait tanulmányozták. Sudan és Ackerman híresek [1] arról, hogy felfedeztek egy mindenhol definiált kiszámítható függvényt (amit néha egyszerűen "rekurzívnak" neveznek), amely nem primitív rekurzív . Szudán felfedezte a kevésbé ismert Szudán funkciót , ami után tőle függetlenül Ackerman 1928-ban publikálta funkcióját . A három argumentumból álló Ackermann-függvényt úgy határoztuk meg, hogy az összeadás, szorzás vagy hatványozás műveletét hajtotta végre:
és kibővítésre került Knuth 1976-ban közzétett nyíl jelölésével :
.(Amellett, hogy történelmi szerepe volt az első, mindenhol definiált, nem primitív rekurzív kiszámítható függvény, Ackermann eredeti függvénye kiterjesztette az alapvető aritmetikai műveleteket a hatványozáson túlra, bár nem olyan jól az olyan dedikált függvényeket, mint a Goodstein -féle hiperoperátor sorozat .)
A végtelenről című művében Hilbert azt sejtette, hogy Ackermann függvénye nem primitíven rekurzív, és Ackerman (Hilbert személyi titkára és egykori tanítványa) bebizonyította ezt a sejtést Hilbert A valós számok felépítése című művében. Rosa Peter és Raphael Robinson később bemutatta az Ackermann-függvény kétargumentumos változatát, amelyet sok szerző most az eredetivel szemben preferál [2] .
Az Ackermann-függvény rekurzív módon van definiálva nemnegatív egész számokhoz , és a következőképpen:
Talán nem tűnik nyilvánvalónak, hogy a rekurzió mindig véget ér. Ez abból következik, hogy egy rekurzív hívásnál vagy az értéke csökken , vagy az értéke megmarad, de az értéke csökken . Ez azt jelenti, hogy minden alkalommal, amikor a pár lexikográfiai sorrendben csökken , ami azt jelenti, hogy az érték végül eléri a nullát: egy értékhez véges számú lehetséges érték van (mivel az első hívás az adatokkal valamilyen meghatározott értékkel készült , és ha az érték megmarad, az érték csak csökkenhet), és a lehetséges értékek száma is véges. Csökkentésekor azonban a -kal növekvő érték korlátlan és általában nagyon nagy.
(összes blokk ) |
Mivel a függvény nagyon gyorsan növekszik, az inverz függvény , amelyet jelöl , nagyon lassan növekszik. Ezzel a függvénnyel találkozhatunk néhány algoritmus komplexitásának tanulmányozása során , például egy diszjunkt halmazrendszer vagy a Chazell-algoritmus egy minimális feszítőfa létrehozására [3] . Az aszimptotika elemzésekor feltételezhetjük, hogy minden gyakorlatilag előforduló számra ennek a függvénynek az értéke kisebb, mint öt, mivel nem kisebb, mint .
Az Ackerman függvény definíciójából adódóan nagyon mély rekurziós szinttel rendelkezik, amellyel tesztelhető a fordító rekurzióoptimalizáló képessége. Yngwie Sundblad [4] volt az első, aki erre az Ackerman függvényt használta .
Brian Wichman ( a Whetstone benchmark társszerzője ) figyelembe vette ezt a cikket, amikor cikksorozatot írt a hívásoptimalizálás teszteléséről [5] [6] [7] .
Például egy olyan fordító, amely egy számítás elemzésekor képes közbenső értékeket tárolni, például és , száz- és ezerszeresére gyorsíthatja a számítást . A rekurzív kibővítés helyett közvetlen kiértékelés is jelentősen felgyorsítja a számítást. A számítás lineáris időt vesz igénybe . A számítás másodfokú időt igényel, mivel O ( ) beágyazott hívásokká bővül a különböző . A számítási idő arányos .
Az érték egyszerű rekurzív alkalmazással ésszerű időn belül nem számítható ki. Ehelyett gyorsírási képleteket használnak a rekurzív hívások optimalizálására, például .
Az Ackermann-függvény értékeinek kiszámításának egyik gyakorlati módja a köztes eredmények memorizálása . A fordító ezt a technikát automatikusan alkalmazhatja egy függvényre Donald Michie memo függvényeinek [8] [9] segítségével .
Nagy számok | |
---|---|
Számok | |
Funkciók | |
Jelölések |