Rekurzivní algoritmus: popis, analýza, funkce a příklady

Obsah:

Rekurzivní algoritmus: popis, analýza, funkce a příklady
Rekurzivní algoritmus: popis, analýza, funkce a příklady
Anonim

Moderní chápání rekurze: definice funkčnosti a přístup k ní zvenčí a z této funkce. Předpokládá se, že rekurzi zrodili matematici: faktoriální výpočet, nekonečné řady, fraktály, pokračující zlomky… Rekurzi však najdeme všude. Objektivní přírodní zákony „považují“rekurzi za svůj hlavní algoritmus a formu vyjádření (existence) ani ne tak objektů hmotného světa, ale obecně za hlavní algoritmus pohybu.

rekurzivní algoritmus
rekurzivní algoritmus

Lidé různých specializací v různých oblastech vědy a techniky používají rekurzivní algoritmus f (x), kde "x ~/=f (x)". Funkce, která volá sama sebe, je silné řešení, ale vytvoření a pochopení tohoto řešení je ve většině případů velmi obtížný úkol.

Ve starověku se ke zvětšení prostoru paláce používala rekurze. Prostřednictvím systému zrcadel namířených proti sobě můžete vytvářet úžasné trojrozměrné prostorové efekty. Ale je to tak snadné pochopit jaknastavit tato zrcátka? Ještě obtížnější je určit, kde je bod v prostoru odražený několika zrcadly.

Rekurze, rekurzivní algoritmy: význam a syntaxe

Problém, který je formulován opakováním sekvence operací, lze řešit rekurzivně. Jednoduchý algoritmus (výpočet kvadratické rovnice, skript pro naplnění webové stránky informacemi, čtení souboru, odeslání zprávy…) nevyžaduje rekurzi.

Hlavní rozdíly v algoritmu, který umožňuje rekurzivní řešení:

  • existuje algoritmus, který je třeba provést několikrát;
  • algoritmus potřebuje data, která se pokaždé mění;
  • algoritmus se nemusí pokaždé měnit;
  • existuje poslední podmínka: algoritmus je rekurzivní – není nekonečný.

Obecně nelze tvrdit, že jednorázové provedení je nezbytnou podmínkou pro absenci důvodu rekurze. Také nemůžete vyžadovat povinnou závěrečnou podmínku: nekonečné rekurze mají svůj vlastní rozsah.

Algoritmus je rekurzivní: když se sekvence operací provádí opakovaně, na datech, která se pokaždé mění a pokaždé poskytují nový výsledek.

Rekurzní vzorec

Matematické chápání rekurze a její analogie v programování se liší. Matematika, i když existují známky programování, ale programování je matematika mnohem vyššího řádu.

rekurzivní algoritmus f
rekurzivní algoritmus f

Dobře napsaný algoritmus je jako zrcadlo intelektu svého autora. Všeobecnévzorec rekurze v programování je "f(x)", kde "x ~/=f(x)" má alespoň dvě interpretace. Zde "~" je podobnost nebo nepřítomnost výsledku a "=" je přítomnost výsledku funkce.

První možnost: dynamika dat.

  • funkce "f(x)" má rekurzivní a neměnný algoritmus;
  • "x" a výsledek "f(x)" mají pokaždé nové hodnoty, výsledek "f(x)" je nový parametr "x" této funkce.

Druhá možnost: dynamika kódu.

  • funkce "f(x)" má několik algoritmů, které zpřesňují (analyzují) data;
  • analýza dat - jedna část kódu a implementace rekurzivních algoritmů, které provádějí požadovanou akci - druhá část kódu;
  • výsledek funkce "f(x)" není.

Žádný výsledek není normální. Programování není matematika, zde výsledek nemusí být explicitně přítomen. Rekurzivní funkce může jednoduše analyzovat stránky a naplnit databázi nebo vytvořit instanci objektů podle příchozího vstupu.

Data a rekurze

Programování rekurzivních algoritmů není o výpočtu faktoriálu, ve kterém funkce obdrží pokaždé danou hodnotu, která je o jednu větší nebo menší než jedna - možnost implementace závisí na preferencích vývojáře.

Nezáleží na tom, jak faktoriál „8!“,algoritmus, který přesně dodržuje tento vzorec.

Zpracování informací je „matematika“zcela jiného řádu. Rekurzivní funkce a algoritmy zde pracují s písmeny, slovy, frázemi, větami a odstavci. Každá další úroveň používá tu předchozí.

Vstupní datový tok je analyzován v širokém rozsahu podmínek, ale proces analýzy je obecně rekurzivní. Nemá smysl psát jedinečné algoritmy pro všechny varianty vstupního proudu. Měla by existovat jedna funkce. Zde jsou rekurzivní algoritmy příklady toho, jak vytvořit výstupní proud, který je adekvátní vstupu. Toto není výstup rekurzivního algoritmu, ale je to požadované a nezbytné řešení.

Abstrakce, rekurze a OOP

Objektově orientované programování (OOP) a rekurze jsou zásadně odlišné entity, které se však dokonale doplňují. Abstrakce nemá nic společného s rekurzí, ale optikou OOP vytváří možnost implementace kontextové rekurze.

Například se analyzují informace a písmena, slova, fráze, věty a odstavce jsou zvýrazněny samostatně. Vývojář samozřejmě zajistí tvorbu instancí objektů těchto pěti typů a nabídne řešení rekurzivních algoritmů na každé úrovni.

programování rekurzivních algoritmů
programování rekurzivních algoritmů

Mezitím, pokud na úrovni písmen „nemá smysl hledat význam“, pak se sémantika objeví na úrovni slov. Slova můžete rozdělit na slovesa, podstatná jména, příslovce, předložky… Můžete jít dále a definovat případy.

Na úrovni fráze je sémantika doplněna interpunkčními znaménky a logikouslovní spojení. Na úrovni vět se nachází dokonalejší úroveň sémantiky a odstavec lze považovat za úplnou myšlenku.

Objektově orientovaný vývoj předurčuje dědičnost vlastností a metod a navrhuje zahájit hierarchii objektů vytvořením zcela abstraktního předka. Přitom nepochybně bude analýza každého potomka rekurzivní a nebude se na technické úrovni v mnoha pozicích příliš lišit (písmena, slova, fráze a věty). Odstavce, stejně jako úplné myšlenky, mohou z tohoto seznamu vyčnívat, ale nejsou podstatou.

Je důležité, aby převážnou část algoritmu bylo možné formulovat na úrovni abstraktního předka a upřesnit ji na úrovni každého potomka pomocí dat a metod volaných z abstraktní úrovně. V tomto kontextu abstrakce otevírá nové obzory pro rekurzi.

Historické prvky OOP

OOP přišel do světa softwaru dvakrát, i když někteří odborníci mohou označit vznik cloud computingu a moderních představ o objektech a třídách jako nové kolo ve vývoji IT technologií.

Pojmy „objekt“a „objektivní“jsou v moderním kontextu OOP obvykle připisovány 50. a 60. letům minulého století, ale jsou spojovány s rokem 1965 a vznikem Simula, Lisp, Algol, Smalltalk.

V té době nebylo programování nijak zvlášť rozvinuté a nemohlo adekvátně reagovat na revoluční koncepty. Boj nápadů a programovacích stylů (C/C++ a Pascal - většinou) byl ještě daleko a databáze byly stále koncepčně tvořeny.

rekurzivní rekurzivní algoritmy
rekurzivní rekurzivní algoritmy

Koncem 80. a začátkem 90. let se objekty objevily v Pascalu a všichni si pamatovali třídy v C/C++ – to znamenalo nové kolo zájmu o OOP a právě tehdy nástroje, především programovací jazyky, přestaly fungovat podporují pouze objektově orientované nápady, ale podle toho se vyvíjejí.

Samozřejmě, pokud dřívější rekurzivní algoritmy byly pouze funkcemi používanými v obecném kódu programu, nyní by se rekurze mohla stát součástí vlastností objektu (třídy), což poskytovalo zajímavé příležitosti v kontextu dědičnosti.

Funkce moderního OOP

Vývoj OOP původně deklaroval objekty (třídy) jako kolekce dat a vlastností (metod). Ve skutečnosti šlo o data, která mají syntaxi a význam. Pak ale nebylo možné prezentovat OOP jako nástroj pro správu skutečných objektů.

rekurzivní funkce a algoritmy
rekurzivní funkce a algoritmy

OOP se stal nástrojem pro správu objektů „počítačové povahy“. Skript, tlačítko, položka nabídky, panel nabídek, značka v okně prohlížeče je objekt. Ale ne stroj, potravinářský výrobek, slovo nebo věta. Skutečné objekty zůstaly mimo objektově orientované programování a počítačové nástroje přijaly novou inkarnaci.

Vzhledem k rozdílům v populárních programovacích jazycích se objevilo mnoho dialektů OOP. Z hlediska sémantiky jsou prakticky ekvivalentní a jejich zaměření na instrumentální sféru, nikoli na aplikovanou, umožňuje přenést popis skutečných objektů za hranicealgoritmy a zajistit jejich multiplatformní a mezijazykovou „existenci“.

Zásobníky a mechanismy volání funkcí

Mechanismy pro volání funkcí (procedury, algoritmy) vyžadují předání dat (parametrů), vrácení výsledku a zapamatování adresy operátora, který musí po dokončení funkce (procedury) obdržet řízení.

příklady rekurzivních algoritmů
příklady rekurzivních algoritmů

K tomuto účelu se obvykle používá zásobník, ačkoli programovací jazyky nebo samotný vývojář mohou poskytnout různé možnosti pro přenos ovládání. Moderní programování připouští, že jméno funkce nemůže být pouze parametrem: může být vytvořeno během provádění algoritmu. Algoritmus lze také vytvořit při provádění jiného algoritmu.

Koncept rekurzivních algoritmů, kdy jejich jména a těla lze určit v době tvorby úkolu (výběrem požadovaného algoritmu), rozšiřuje rekurzivitu nejen na to, jak něco udělat, ale také na to, kdo přesně by měl Udělej to. Výběr algoritmu podle jeho "smysluplného" názvu je slibný, ale přináší potíže.

Rekurzivita na sadě funkcí

Nemůžete říci, že algoritmus je rekurzivní, když volá sám sebe, a to je vše. Programování není dogma a koncept rekurzivity není výhradním požadavkem, abyste se mohli volat z těla vašeho vlastního algoritmu.

Praktické aplikace neposkytují vždy čisté řešení. Často musí být připravena počáteční data a výsledek rekurzivního volání musí být analyzován v kontextu celého problému (celého algoritmu) vcelkově.

Ve skutečnosti nejen před voláním rekurzivní funkce, ale také po jejím dokončení může nebo by měl být volán jiný program. Pokud s voláním nejsou žádné zvláštní problémy: rekurzivní funkce A() zavolá funkci B(), která něco udělá a zavolá A(), pak je okamžitě problém s návratem řízení. Po dokončení rekurzivního volání musí funkce A() obdržet řízení, aby mohla znovu zavolat B(), která ji zavolá znovu. Vrácení kontroly, jak by mělo být v pořadí na zásobníku zpět do B(), je špatné řešení.

Programátor není omezen ve výběru parametrů a může je doplnit názvy funkcí. Jinými slovy, ideálním řešením je předat jméno B() A() a nechat A() samo volat B(). V tomto případě nebudou problémy s vracením kontroly a implementace rekurzivního algoritmu bude transparentnější.

Porozumění a úroveň rekurze

Problém s vývojem rekurzivních algoritmů je v tom, že musíte pochopit dynamiku procesu. Při použití rekurze v objektových metodách, zejména na úrovni abstraktního předka, nastává problém s pochopením vlastního algoritmu v kontextu doby jeho provádění.

řešení rekurzivních algoritmů
řešení rekurzivních algoritmů

V současné době neexistují žádná omezení na úroveň vnoření funkcí a kapacitu zásobníku v mechanismech volání, ale existuje problém s pochopením: v jakém časovém okamžiku která datová úroveň nebo které místo v obecném algoritmu nazývaném rekurzivní funkce a na jakém počtu hovorů ona sama je.

Stávající ladicí nástroje jsou často bezmocnéřekněte programátorovi správné řešení.

Smyčky a rekurze

Uvažuje se, že cyklické provádění je ekvivalentní rekurzi. V některých případech může být rekurzivní algoritmus skutečně implementován v syntaxi podmíněných a cyklických konstruktů.

Pokud je však jasné, že konkrétní funkce musí být implementována prostřednictvím rekurzivního algoritmu, mělo by být opuštěno jakékoli externí použití smyčky nebo podmíněných příkazů.

implementace rekurzivních algoritmů
implementace rekurzivních algoritmů

Smyslem je, že rekurzivní řešení ve formě funkce využívající sebe sama bude úplným, funkčně úplným algoritmem. Tento algoritmus bude vyžadovat, aby jej programátor vytvořil s velkým úsilím a porozuměl dynamice algoritmu, ale bude to konečné řešení, které nevyžaduje externí kontrolu.

Jakákoli kombinace externích podmíněných a cyklických operátorů nám nedovolí reprezentovat rekurzivní algoritmus jako kompletní funkci.

Rekurzní konsensus a OOP

V téměř všech variantách vývoje rekurzivního algoritmu vzniká plán na vývoj dvou algoritmů. První algoritmus generuje seznam budoucích objektů (instancí) a druhý algoritmus je vlastně rekurzivní funkce.

Nejlepším řešením by bylo uspořádat rekurzi jako jedinou vlastnost (metodu), která ve skutečnosti obsahuje rekurzivní algoritmus, a vložit veškerou přípravnou práci do konstruktoru objektu.

Rekurzivní algoritmus bude tím správným řešením pouze tehdy, když bude fungovatpouze sám sebou, bez vnější kontroly a řízení. Externí algoritmus může pouze dát signál k práci. Výsledkem této práce by mělo být očekávané řešení bez externí podpory.

Rekurze by měla být vždy kompletní samostatné řešení.

Intuitivní porozumění a funkční úplnost

Když se objektově orientované programování stalo de facto standardem, bylo zřejmé, že k efektivnímu kódování je potřeba změnit své vlastní myšlení. Programátor musí během provádění algoritmu přejít od syntaxe a sémantiky jazyka k dynamice sémantiky.

Charakteristika rekurze: lze ji použít na všechno:

  • web scraping;
  • vyhledávací operace;
  • parsing textových informací;
  • čtení nebo vytváření dokumentů MS Word;
  • vzorkování nebo analýza značek…

Charakteristika OOP: umožňuje popsat rekurzivní algoritmus na úrovni abstraktního předka, ale umožňuje mu odkazovat na jedinečné potomky, z nichž každý má svou vlastní paletu dat a vlastností.

koncept rekurzivních algoritmů
koncept rekurzivních algoritmů

Rekurze je ideální, protože vyžaduje funkční úplnost svého algoritmu. OOP zlepšuje výkon rekurzivního algoritmu tím, že mu poskytuje přístup ke všem jedinečným dětem.

Doporučuje: