Comprensió moderna de la recursivitat: definició de la funcionalitat i accés a ella des de l'exterior i des d'aquesta funcionalitat. Es creu que la recursivitat va néixer pels matemàtics: càlcul factorial, sèries infinites, fractals, fraccions continuades… Tanmateix, la recursivitat es pot trobar a tot arreu. Les lleis naturals objectives "consideren" la recursivitat com el seu algorisme principal i la seva forma d'expressió (existència) no tant dels objectes del món material, sinó en general l'algorisme principal del moviment.
Les persones de diverses especialitats en diversos camps de la ciència i la tecnologia utilitzen l'algorisme recursiu f (x), on "x ~/=f (x)". Una funció que es diu a si mateixa és una solució sòlida, però formar i comprendre aquesta solució és, en la majoria dels casos, una tasca molt difícil.
A l'antiguitat, la recursió s'utilitzava per augmentar l'espai del palau. Mitjançant un sistema de miralls dirigits entre si, podeu crear efectes espacials tridimensionals impressionants. Però és tan fàcil entendre com?ajustar aquests miralls? Encara és més difícil determinar on es troba un punt de l'espai reflectit a través de diversos miralls.
Recursió, algorismes recursius: significat i sintaxi
El problema, que es formula repetint una seqüència d'operacions, es pot resoldre de forma recursiva. Un algorisme senzill (computar una equació de segon grau, un script per omplir una pàgina web amb informació, llegir un fitxer, enviar un missatge…) no requereix recursivitat.
Principals diferències de l'algorisme que permet una solució recursiva:
- hi ha un algorisme que s'ha d'executar diverses vegades;
- L'algoritmenecessita dades que canvien cada vegada;
- l'algorisme no ha de canviar cada cop;
- hi ha una condició final: l'algorisme és recursiu, no infinit.
En general, no es pot argumentar que l'execució única sigui una condició necessària per a l'absència de motius per a la recursivitat. Tampoc no podeu exigir una condició final obligatòria: les recursivitats infinites tenen el seu propi abast.
L'algorisme és recursiu: quan es realitza una seqüència d'operacions repetidament, sobre dades que canvien cada vegada i donen un nou resultat cada vegada.
Fórmula de recursivitat
La comprensió matemàtica de la recursivitat i el seu anàleg en la programació són diferents. Matemàtiques, tot i que hi ha signes de programació, però la programació és matemàtica d'un ordre molt superior.
Un algorisme ben escrit és com un mirall de l'intel·lecte del seu autor. Generalla fórmula de recursivitat en programació és "f(x)", on "x ~/=f(x)" té almenys dues interpretacions. Aquí "~" és la semblança o absència del resultat, i "=" és la presència del resultat de la funció.
Primera opció: dinàmica de dades.
- funció "f(x)" té un algorisme recursiu i immutable;
- "x" i el resultat "f(x)" tenen valors nous cada vegada, el resultat "f(x)" és el nou paràmetre "x" d'aquesta funció.
Segona opció: dinàmica del codi.
- funció "f(x)" té diversos algorismes que perfeccionen (analitzen) les dades;
- anàlisi de dades - una part del codi i la implementació d'algorismes recursius que realitzen l'acció desitjada - la segona part del codi;
- el resultat de la funció "f(x)" no és.
Cap resultat és normal. La programació no és matemàtica, aquí el resultat no ha d'estar explícitament present. Una funció recursiva només pot analitzar llocs i omplir la base de dades, o crear una instancia d'objectes segons l'entrada entrant.
Dades i recursivitat
La programació d'algorismes recursius no consisteix en calcular un factorial, en què la funció rep cada cop un valor determinat que és un més o menys que un; l'opció d'implementació depèn de la preferència del desenvolupador.
No importa com sigui el factorial "8!",algorisme que segueix estrictament aquesta fórmula.
El processament de la informació és "matemàtiques" d'un ordre completament diferent. Les funcions recursives i els algorismes aquí funcionen amb lletres, paraules, frases, frases i paràgrafs. Cada nivell següent utilitza l'anterior.
El flux de dades d'entrada s'analitza en una àmplia gamma de condicions, però el procés d'anàlisi és generalment recursiu. No té sentit escriure algorismes únics per a totes les variants del flux d'entrada. Hi hauria d'haver una funcionalitat. Aquí, els algorismes recursius són exemples de com formar un flux de sortida adequat a l'entrada. Aquesta no és la sortida de l'algorisme recursiu, però és la solució desitjada i necessària.
Abstracció, recursivitat i POO
La programació orientada a objectes (OOP) i la recursivitat són entitats fonamentalment diferents, però es complementen perfectament. L'abstracció no té res a veure amb la recursivitat, però a través de la lent de la POO crea la possibilitat d'implementar la recursivitat contextual.
Per exemple, la informació s'està analitzant i les lletres, les paraules, les frases, les frases i els paràgrafs es destaquen per separat. Òbviament, el desenvolupador preveu la creació d'instàncies d'objectes d'aquests cinc tipus i oferirà una solució d'algorismes recursius a cada nivell.
Mentrestant, si a nivell de lletres “no té sentit buscar sentit”, aleshores apareix la semàntica a nivell de paraules. Podeu dividir les paraules en verbs, substantius, adverbis, preposicions… Podeu anar més enllà i definir casos.
A nivell de frase, la semàntica es complementa amb signes de puntuació i lògicacombinacions de paraules. A nivell de frases, es troba un nivell de semàntica més perfecte i un paràgraf es pot considerar com un pensament complet.
El desenvolupament orientat a objectes predetermina l'herència de propietats i mètodes i proposa començar la jerarquia dels objectes amb la creació d'un avantpassat completament abstracte. Alhora, sens dubte, l'anàlisi de cada descendent serà recursiva i no diferirà massa a nivell tècnic en moltes posicions (lletres, paraules, frases i frases). Els paràgrafs, com els pensaments complets, poden destacar d'aquesta llista, però no són l'essència.
És important que la part aclaparadora de l'algorisme es pugui formular a nivell d'avantpassat abstracte, refinant-lo a nivell de cada descendent amb dades i mètodes anomenats des del nivell abstracte. En aquest context, l'abstracció obre nous horitzons per a la recursivitat.
Característiques històriques de la POO
OOP ha arribat al món del programari dues vegades, tot i que alguns experts poden destacar l'aparició de la informàtica en núvol i les idees modernes sobre objectes i classes com una nova ronda en el desenvolupament de tecnologies informàtiques.
Els termes "objecte" i "objectiu" en el context modern de la POO se solen atribuir als anys 50 i 60 del segle passat, però s'associen amb 1965 i l'aparició de Simula, Lisp, Algol, Smalltalk.
En aquells temps, la programació no estava especialment desenvolupada i no podia respondre adequadament als conceptes revolucionaris. La lluita d'idees i d'estils de programació (C/C++ i Pascal, sobretot) estava encara lluny, i les bases de dades encara estaven formades conceptualment.
A finals dels 80 i principis dels 90, els objectes van aparèixer a Pascal i tothom recordava les classes en C/C++; això va marcar una nova ronda d'interès per la POO i va ser llavors quan les eines, principalment els llenguatges de programació, no es van convertir en només admet idees orientades a objectes, però evoluciona en conseqüència.
Per descomptat, si els algorismes recursius anteriors eren només funcions utilitzades en el codi general del programa, ara la recursivitat podria passar a formar part de les propietats d'un objecte (classe), la qual cosa proporcionava oportunitats interessants en el context de l'herència.
Característica de la POO moderna
El desenvolupament de la POO va declarar inicialment objectes (classes) com a col·leccions de dades i propietats (mètodes). De fet, es tractava de dades que tenen sintaxi i significat. Però aleshores no va ser possible presentar la POO com una eina per gestionar objectes reals.
OOP s'ha convertit en una eina per gestionar objectes de "naturalesa informàtica". Un script, un botó, un element de menú, una barra de menú, una etiqueta en una finestra del navegador és un objecte. Però no una màquina, un producte alimentari, una paraula o una frase. Els objectes reals s'han quedat fora de la programació orientada a objectes i les eines informàtiques han adquirit una nova encarnació.
A causa de les diferències en els llenguatges de programació populars, han sorgit molts dialectes de POO. Pel que fa a la semàntica, són pràcticament equivalents, i el seu enfocament en l'àmbit instrumental, i no en l'aplicatiu, permet portar la descripció dels objectes reals més enllà.algorismes i garantir la seva "existència" multiplataforma i multiidioma.
Piles i mecanismes de trucada de funcions
Els mecanismes per cridar funcions (procediments, algorismes) requereixen passar dades (paràmetres), retornar un resultat i recordar l'adreça de l'operador que ha de rebre el control un cop finalitzada la funció (procediment).
Normalment, la pila s'utilitza per a aquest propòsit, encara que els llenguatges de programació o el propi desenvolupador poden oferir una varietat d'opcions per transferir el control. La programació moderna admet que el nom d'una funció no només pot ser un paràmetre: es pot formar durant l'execució de l'algorisme. També es pot crear un algorisme mentre s'executa un altre algorisme.
El concepte d'algorismes recursius, quan els seus noms i cossos es poden determinar en el moment de la formació de la tasca (escollint l'algoritme desitjat), amplia la recursivitat no només a com fer alguna cosa, sinó també a qui hauria de fer-ho. fes-ho. Triar un algorisme pel seu nom "significatiu" és prometedor, però crea dificultats.
Recursivitat en un conjunt de funcions
No es pot dir que un algorisme és recursiu quan es diu a si mateix i ja està. La programació no és un dogma, i el concepte de recursivitat no és un requisit exclusiu per anomenar-vos des del cos del vostre propi algorisme.
Les aplicacions pràctiques no sempre donen una solució neta. Sovint, les dades inicials s'han de preparar i el resultat de la crida recursiva s'ha d'analitzar en el context de tot el problema (tot l'algorisme) enen general.
De fet, no només abans de cridar una funció recursiva, sinó també després que s'hagi completat, es pot o s'ha de cridar un altre programa. Si no hi ha problemes especials amb la trucada: la funció recursiva A() crida a la funció B(), que fa alguna cosa i crida a A(), llavors immediatament hi ha un problema amb el retorn del control. Després d'haver completat la crida recursiva, la funció A() ha de rebre control per tornar a cridar B(), que la cridarà de nou. Tornar el control com hauria de ser en ordre a la pila a B() és la solució equivocada.
El programador no està limitat en l'elecció de paràmetres i pot completar-los amb noms de funció. En altres paraules, la solució ideal és passar el nom de B() a A() i deixar que el mateix A() cridi B(). En aquest cas, no hi haurà problemes per retornar el control i la implementació de l'algorisme recursiu serà més transparent.
Comprensió i nivell de recursivitat
El problema amb el desenvolupament d'algorismes recursius és que cal entendre la dinàmica del procés. Quan utilitzeu la recursivitat en mètodes d'objectes, especialment a nivell d'avantpassat abstracte, hi ha un problema per entendre el vostre propi algorisme en el context del seu temps d'execució.
Actualment, no hi ha restriccions sobre el nivell d'imbricació de funcions i la capacitat de pila en els mecanismes de trucada, però hi ha un problema d'entendre: en quin moment del temps quin nivell de dades o quin lloc de l'algorisme general s'anomena recursiu. funció i en quin nombre de trucades és ella mateixa.
Les eines de depuració existents solen ser impotentsdigues al programador la solució correcta.
Bucles i recursivitat
Es considera que l'execució cíclica és equivalent a la recursivitat. De fet, en alguns casos, l'algorisme recursiu es pot implementar en la sintaxi de construccions condicionals i cícliques.
No obstant això, si hi ha una comprensió clara que una funció concreta s'ha d'implementar mitjançant un algorisme recursiu, s'hauria d'abandonar qualsevol ús extern d'un bucle o declaracions condicionals.
El significat aquí és que una solució recursiva en forma d'una funció que s'utilitza a si mateixa serà un algorisme complet i funcionalment complet. Aquest algorisme requerirà que el programador el crei amb esforç, entenent la dinàmica de l'algorisme, però serà la solució final que no requereix control extern.
Qualsevol combinació d'operadors condicionals i cíclics externs no ens permetrà representar l'algorisme recursiu com una funció completa.
Consens de recursivitat i POO
En gairebé totes les variants de desenvolupament d'un algorisme recursiu, sorgeix un pla per desenvolupar dos algorismes. El primer algorisme genera una llista d'objectes futurs (instàncies) i el segon algorisme és en realitat una funció recursiva.
La millor solució seria organitzar la recursivitat com una propietat única (mètode) que en realitat conté l'algorisme recursiu i posar tot el treball preparatori al constructor d'objectes.
Un algorisme recursiu només serà la solució adequada quan funcioninomés per ell mateix, sense control i gestió externs. Un algorisme extern només pot donar un senyal perquè funcioni. El resultat d'aquest treball hauria de ser la solució esperada, sense suport extern.
La recursència sempre hauria de ser una solució completa autònoma.
Comprensió intuïtiva i completitud funcional
Quan la programació orientada a objectes es va convertir en l'estàndard de facto, es va fer evident que per codificar de manera eficaç, cal canviar el vostre propi pensament. El programador ha de passar de la sintaxi i la semàntica del llenguatge a la dinàmica de la semàntica durant l'execució de l'algorisme.
Característica de la recursivitat: es pot aplicar a tot:
- raspat web;
- operacions de cerca;
- anàlisi de la informació del text;
- llegir o crear documents de MS Word;
- mostreig o anàlisi d'etiquetes…
Característica de la POO: permet descriure un algorisme recursiu al nivell d'un avantpassat abstracte, però preveu que es refereixi a descendents únics, cadascun dels quals té la seva pròpia paleta de dades i propietats.
La recursència és ideal perquè requereix la integritat funcional del seu algorisme. La POO millora el rendiment d'un algorisme recursiu donant-li accés a tots els fills únics.