Algoritmo ricorsivo: descrizione, analisi, caratteristiche ed esempi

Sommario:

Algoritmo ricorsivo: descrizione, analisi, caratteristiche ed esempi
Algoritmo ricorsivo: descrizione, analisi, caratteristiche ed esempi
Anonim

Comprensione moderna della ricorsione: definizione di funzionalità e accesso ad essa dall'esterno e da questa funzionalità. Si ritiene che la ricorsione sia nata dai matematici: calcolo fattoriale, serie infinite, frattali, frazioni continue … Tuttavia, la ricorsione può essere trovata ovunque. Le leggi naturali oggettive “considerano” la ricorsione come il loro principale algoritmo e forma di espressione (esistenza) non tanto degli oggetti del mondo materiale, ma in generale il principale algoritmo del movimento.

algoritmo ricorsivo
algoritmo ricorsivo

Persone con varie specialità in vari campi della scienza e della tecnologia usano l'algoritmo ricorsivo f (x), dove "x ~/=f (x)". Una funzione che si autodefinisce è una soluzione efficace, ma formare e comprendere questa soluzione è, nella maggior parte dei casi, un compito molto difficile.

Nei tempi antichi, la ricorsione veniva usata per aumentare lo spazio del palazzo. Attraverso un sistema di specchi diretti l'uno verso l' altro, è possibile creare straordinari effetti spaziali tridimensionali. Ma è così facile capire comeregolare questi specchi? È ancora più difficile determinare dove si trova un punto nello spazio, riflesso attraverso diversi specchi.

Ricorsione, algoritmi ricorsivi: significato e sintassi

Il problema, che si formula ripetendo una sequenza di operazioni, può essere risolto ricorsivamente. Un semplice algoritmo (calcolo di un'equazione quadratica, script per popolare una pagina web con informazioni, lettura di un file, invio di un messaggio…) non richiede la ricorsione.

Principali differenze dell'algoritmo che consente una soluzione ricorsiva:

  • c'è un algoritmo che deve essere eseguito più volte;
  • l'algoritmo ha bisogno di dati che cambiano ogni volta;
  • l'algoritmo non deve cambiare ogni volta;
  • c'è una condizione finale: l'algoritmo è ricorsivo - non infinito.

In generale, non si può sostenere che l'esecuzione una tantum sia una condizione necessaria per l'assenza di un motivo per la ricorsione. Inoltre non puoi richiedere una condizione finale obbligatoria: le ricorsioni infinite hanno il loro scopo.

L'algoritmo è ricorsivo: quando una sequenza di operazioni viene eseguita ripetutamente, su dati che cambiano ogni volta e danno ogni volta un nuovo risultato.

Formula di ricorsione

La comprensione matematica della ricorsione e del suo analogo nella programmazione sono differenti. Matematica, anche se ci sono segni di programmazione, ma la programmazione è matematica di un ordine molto più alto.

algoritmo ricorsivo f
algoritmo ricorsivo f

Un algoritmo ben scritto è come uno specchio dell'intelletto del suo autore. Generalela formula di ricorsione in programmazione è "f(x)", dove "x ~/=f(x)" ha almeno due interpretazioni. Qui "~" è la somiglianza o assenza del risultato e "=" è la presenza del risultato della funzione.

Prima opzione: dinamica dei dati.

  • La funzione "f(x)" ha un algoritmo ricorsivo e immutabile;
  • "x" e il risultato "f(x)" hanno nuovi valori ogni volta, il risultato "f(x)" è il nuovo parametro "x" di questa funzione.

Seconda opzione: dinamica del codice.

  • La funzione "f(x)" ha diversi algoritmi che perfezionano (analizzano) i dati;
  • analisi dei dati - una parte del codice e implementazione di algoritmi ricorsivi che eseguono l'azione desiderata - la seconda parte del codice;
  • il risultato della funzione "f(x)" non è.

Nessun risultato è normale. La programmazione non è matematica, qui il risultato non deve essere esplicitamente presente. Una funzione ricorsiva può semplicemente analizzare i siti e popolare il database, o creare un'istanza di oggetti in base all'input in entrata.

Dati e ricorsione

La programmazione di algoritmi ricorsivi non riguarda il calcolo di un fattoriale, in cui la funzione riceve ogni volta un dato valore che è uno in più o in meno di uno - l'opzione di implementazione dipende dalle preferenze dello sviluppatore.

Non importa come il fattoriale "8!",algoritmo che segue rigorosamente questa formula.

L'elaborazione delle informazioni è "matematica" di un ordine completamente diverso. Le funzioni e gli algoritmi ricorsivi qui operano su lettere, parole, frasi, frasi e paragrafi. Ogni livello successivo utilizza il precedente.

Il flusso di dati di input viene analizzato in un'ampia gamma di condizioni, ma il processo di analisi è generalmente ricorsivo. Non ha senso scrivere algoritmi univoci per tutte le varianti del flusso di input. Dovrebbe esserci una funzionalità. Qui, gli algoritmi ricorsivi sono esempi di come formare un flusso di output adeguato all'input. Questo non è l'output dell'algoritmo ricorsivo, ma è la soluzione desiderata e necessaria.

Astrazione, ricorsione e OOP

La programmazione orientata agli oggetti (OOP) e la ricorsione sono entità fondamentalmente diverse, ma si completano perfettamente a vicenda. L'astrazione non ha nulla a che fare con la ricorsione, ma attraverso la lente di OOP crea la possibilità di implementare la ricorsione contestuale.

Ad esempio, le informazioni vengono analizzate e lettere, parole, frasi, frasi e paragrafi vengono evidenziati separatamente. Ovviamente, lo sviluppatore provvederà alla creazione di istanze di oggetti di questi cinque tipi e offrirà una soluzione di algoritmi ricorsivi ad ogni livello.

programmazione di algoritmi ricorsivi
programmazione di algoritmi ricorsivi

Intanto, se a livello di lettere “non ha senso cercare il significato”, allora la semantica appare a livello di parole. Puoi dividere le parole in verbi, nomi, avverbi, preposizioni… Puoi andare oltre e definire i casi.

A livello di frase, la semantica è integrata da segni di punteggiatura e logicacombinazioni di parole. A livello di frasi, si trova un livello semantico più perfetto e un paragrafo può essere considerato come un pensiero completo.

Lo sviluppo orientato agli oggetti predetermina l'eredità di proprietà e metodi e propone di iniziare la gerarchia degli oggetti con la creazione di un antenato completamente astratto. Allo stesso tempo, senza dubbio, l'analisi di ogni discendente sarà ricorsiva e non differirà troppo a livello tecnico in molte posizioni (lettere, parole, frasi e frasi). I paragrafi, come i pensieri completi, possono ris altare da questo elenco, ma non sono l'essenza.

È importante che la maggior parte dell'algoritmo possa essere formulata a livello di antenato astratto, perfezionandola a livello di ogni discendente con dati e metodi chiamati dal livello astratto. In questo contesto, l'astrazione apre nuovi orizzonti alla ricorsione.

Caratteristiche storiche di OOP

OOP è arrivato due volte nel mondo del software, anche se alcuni esperti potrebbero individuare l'emergere del cloud computing e delle idee moderne su oggetti e classi come un nuovo round nello sviluppo delle tecnologie IT.

I termini "oggetto" e "obiettivo" nel contesto moderno di OOP sono solitamente attribuiti agli anni '50 e '60 del secolo scorso, ma sono associati al 1965 e all'emergere di Simula, Lisp, Algol, Smalltalk.

In quei giorni, la programmazione non era particolarmente sviluppata e non poteva rispondere adeguatamente a concetti rivoluzionari. La lotta delle idee e degli stili di programmazione (C/C++ e Pascal - per lo più) era ancora lontana e i database erano ancora formati concettualmente.

algoritmi ricorsivi ricorsivi
algoritmi ricorsivi ricorsivi

Alla fine degli anni '80 e all'inizio degli anni '90, gli oggetti apparivano in Pascal e tutti ricordavano le classi in C / C++ - questo ha segnato un nuovo ciclo di interesse per l'OOP ed è stato allora che gli strumenti, principalmente i linguaggi di programmazione, sono diventati supportano solo idee orientate agli oggetti, ma si evolvono di conseguenza.

Ovviamente, se i precedenti algoritmi ricorsivi fossero solo funzioni utilizzate nel codice generale del programma, ora la ricorsione potrebbe diventare parte delle proprietà di un oggetto (classe), che forniva interessanti opportunità nel contesto dell'ereditarietà.

Caratteristica della moderna OOP

Lo sviluppo di OOP inizialmente dichiarava oggetti (classi) come raccolte di dati e proprietà (metodi). In effetti, si trattava di dati che hanno sintassi e significato. Ma poi non è stato possibile presentare OOP come strumento per la gestione di oggetti reali.

funzioni ricorsive e algoritmi
funzioni ricorsive e algoritmi

OOP è diventato uno strumento per la gestione di oggetti di "natura informatica". Uno script, un pulsante, una voce di menu, una barra dei menu, un tag in una finestra del browser è un oggetto. Ma non una macchina, un prodotto alimentare, una parola o una frase. Gli oggetti reali sono rimasti al di fuori della programmazione orientata agli oggetti e gli strumenti informatici hanno assunto una nuova incarnazione.

A causa delle differenze nei linguaggi di programmazione popolari, sono emersi molti dialetti di OOP. In termini semantici sono praticamente equivalenti e la loro focalizzazione sulla sfera strumentale, e non su quella applicata, permette di portare la descrizione di oggetti reali oltrealgoritmi e garantire la loro "esistenza" multipiattaforma e multilingua.

Stack e meccanismi di chiamata di funzione

I meccanismi per chiamare funzioni (procedure, algoritmi) richiedono il passaggio di dati (parametri), la restituzione di un risultato e la memorizzazione dell'indirizzo dell'operatore che deve ricevere il controllo al termine della funzione (procedura).

esempi di algoritmi ricorsivi
esempi di algoritmi ricorsivi

Di solito, lo stack viene utilizzato per questo scopo, sebbene i linguaggi di programmazione o lo stesso sviluppatore possano fornire una varietà di opzioni per il trasferimento del controllo. La programmazione moderna ammette che il nome di una funzione non può essere solo un parametro: può essere formato durante l'esecuzione dell'algoritmo. È anche possibile creare un algoritmo durante l'esecuzione di un altro algoritmo.

Il concetto di algoritmi ricorsivi, quando i loro nomi e corpi possono essere determinati al momento della formazione del compito (scegliendo l'algoritmo desiderato), estende la ricorsività non solo a come fare qualcosa, ma anche a chi dovrebbe esattamente fallo. Scegliere un algoritmo con il suo nome "significativo" è promettente, ma crea difficoltà.

Ricordività su un insieme di funzioni

Non puoi dire che un algoritmo sia ricorsivo quando chiama se stesso e basta. La programmazione non è un dogma e il concetto di ricorsività non è un requisito esclusivo per chiamare te stesso dal corpo del tuo algoritmo.

Le applicazioni pratiche non sempre danno una soluzione pulita. Spesso i dati iniziali devono essere preparati e il risultato della chiamata ricorsiva deve essere analizzato nel contesto dell'intero problema (l'intero algoritmo) innel complesso.

In effetti, non solo prima che una funzione ricorsiva venga chiamata, ma anche dopo che è stata completata, un altro programma può o deve essere chiamato. Se non ci sono problemi particolari con la chiamata: la funzione ricorsiva A() chiama la funzione B(), che fa qualcosa e chiama A(), allora c'è immediatamente un problema con il ritorno del controllo. Dopo aver completato la chiamata ricorsiva, la funzione A() deve ricevere il controllo per richiamare B(), che la chiamerà di nuovo. Restituire il controllo come dovrebbe essere in ordine sullo stack di nuovo a B() è la soluzione sbagliata.

Il programmatore non si limita nella scelta dei parametri e può completarli con nomi di funzioni. In altre parole, la soluzione ideale è passare il nome di B() ad A() e lasciare che A() stesso chiami B(). In questo caso, non ci saranno problemi con la restituzione del controllo e l'implementazione dell'algoritmo ricorsivo sarà più trasparente.

Comprensione e livello di ricorsione

Il problema con lo sviluppo di algoritmi ricorsivi è che è necessario comprendere la dinamica del processo. Quando si utilizza la ricorsione nei metodi degli oggetti, specialmente a livello di un antenato astratto, c'è un problema nel comprendere il proprio algoritmo nel contesto del suo tempo di esecuzione.

risoluzione di algoritmi ricorsivi
risoluzione di algoritmi ricorsivi

Attualmente non ci sono restrizioni sul livello di annidamento delle funzioni e sulla capacità dello stack nei meccanismi di chiamata, ma c'è un problema di comprensione: in quale momento quale livello di dati o quale luogo nell'algoritmo generale chiamato ricorsivo funzione e su che numero di chiamate si trova.

Gli strumenti di debug esistenti sono spesso impotentidì al programmatore la soluzione giusta.

Cicli e ricorsione

Si ritiene che l'esecuzione ciclica sia equivalente alla ricorsione. Infatti, in alcuni casi, l'algoritmo ricorsivo può essere implementato nella sintassi dei costrutti condizionali e ciclici.

Tuttavia, se c'è una chiara comprensione del fatto che una particolare funzione deve essere implementata attraverso un algoritmo ricorsivo, qualsiasi uso esterno di un ciclo o di istruzioni condizionali dovrebbe essere abbandonato.

implementazione di algoritmi ricorsivi
implementazione di algoritmi ricorsivi

Il significato qui è che una soluzione ricorsiva sotto forma di una funzione che utilizza se stessa sarà un algoritmo completo e funzionalmente completo. Questo algoritmo richiederà al programmatore di crearlo con fatica, comprendendo le dinamiche dell'algoritmo, ma sarà la soluzione finale che non richiede il controllo esterno.

Qualsiasi combinazione di operatori condizionali e ciclici esterni non ci consentirà di rappresentare l'algoritmo ricorsivo come una funzione completa.

Consenso ricorsivo e OOP

In quasi tutte le varianti di sviluppo di un algoritmo ricorsivo, nasce un piano per sviluppare due algoritmi. Il primo algoritmo genera un elenco di oggetti futuri (istanze) e il secondo algoritmo è in re altà una funzione ricorsiva.

La soluzione migliore sarebbe organizzare la ricorsione come una singola proprietà (metodo) che contiene effettivamente l'algoritmo ricorsivo e inserire tutto il lavoro preparatorio nel costruttore di oggetti.

Un algoritmo ricorsivo sarà la soluzione giusta solo quando funzioneràsolo da solo, senza controllo e gestione esterni. Un algoritmo esterno può solo dare un segnale per funzionare. Il risultato di questo lavoro dovrebbe essere la soluzione prevista, senza supporto esterno.

La ricorsione dovrebbe sempre essere una soluzione autonoma completa.

Comprensione intuitiva e completezza funzionale

Quando la programmazione orientata agli oggetti è diventata lo standard de facto, è diventato ovvio che per programmare in modo efficace, è necessario cambiare il proprio modo di pensare. Il programmatore deve passare dalla sintassi e semantica del linguaggio alla dinamica della semantica durante l'esecuzione dell'algoritmo.

Caratteristica della ricorsione: applicabile a tutto:

  • web scraping;
  • operazioni di ricerca;
  • analisi delle informazioni di testo;
  • leggere o creare documenti MS Word;
  • campionamento o analisi dei tag…

Caratteristica di OOP: permette di descrivere un algoritmo ricorsivo al livello di un antenato astratto, ma prevede che si riferisca a discendenti unici, ognuno dei quali ha una propria tavolozza di dati e proprietà.

concetto di algoritmi ricorsivi
concetto di algoritmi ricorsivi

La ricorsione è l'ideale perché richiede la completezza funzionale del suo algoritmo. OOP migliora le prestazioni di un algoritmo ricorsivo dandogli accesso a tutti i bambini unici.

Consigliato: