Ricorsività nella struttura dei dati: come funziona, tipi e quando utilizzato

Pubblicato: 2020-05-22

Iniziamo con la definizione di ricorsione nella struttura dati. Discuteremo in seguito diversi tipi di ricorsione e come la ricorsione viene utilizzata per risolvere diversi problemi.

Sommario

Cos'è la ricorsione?

In parole semplici, la ricorsione è un problem solving e, in alcuni casi, una tecnica di programmazione che ha una proprietà molto speciale ed esclusiva. Nella ricorsione, una funzione o un metodo ha la capacità di chiamare se stesso per risolvere il problema. Il processo di ricorsione comporta la risoluzione di un problema trasformandolo in varietà più piccole di se stesso.

Il processo in cui una funzione chiama se stessa potrebbe avvenire direttamente o indirettamente. Questa differenza di chiamata dà origine a diversi tipi di ricorsione, di cui parleremo poco dopo. Alcuni dei problemi che possono essere risolti utilizzando la ricorsione includono DFS of Graph, Towers of Hanoi, Different Types of Tree Traversals e altri. Per conoscere la ricorsione e altri concetti di scienza dei dati, dai un'occhiata ai corsi online di scienza dei dati di IIIT-B.

Leggi: 13 Idee interessanti per progetti sulla struttura dei dati

Come funziona la ricorsione?

Il concetto di ricorsione si fonda sull'idea che un problema può essere risolto molto facilmente e in minor tempo se rappresentato in una o più versioni minori. L'aggiunta di condizioni di base per fermare la ricorsione è un'altra parte importante dell'utilizzo di questo algoritmo per risolvere un problema.

Nessuna esperienza di codifica richiesta. Supporto professionale a 360°. Diploma PG in Machine Learning e AI da IIIT-B e upGrad.

Le persone spesso credono che non sia possibile definire un'entità in termini di se stessa. La ricorsione dimostra che la teoria è sbagliata. E se questa tecnica viene eseguita nel modo giusto, potrebbe produrre risultati molto potenti. Vediamo come funziona la ricorsione con alcuni esempi. Cos'è una frase? Può essere definito come due o più frasi unite tra loro con l'aiuto della congiunzione. Allo stesso modo, una cartella potrebbe essere un dispositivo di archiviazione utilizzato per archiviare file e cartelle. Un antenato potrebbe essere un genitore di uno e un antenato di un altro membro della famiglia nell'albero genealogico.

La ricorsione aiuta a definire situazioni complesse usando poche parole molto semplici. Come definiresti di solito un antenato? Un genitore, un nonno o un bisnonno. Questo potrebbe continuare. Allo stesso modo, definire una cartella potrebbe essere un compito difficile. Potrebbe essere qualsiasi cosa che contenga alcuni file e cartelle che potrebbero essere file e cartelle a sé stanti, e questo potrebbe continuare di nuovo. Questo è il motivo per cui la ricorsione rende la definizione delle situazioni molto più semplice del solito.

Anche la ricorsione è una tecnica di programmazione abbastanza buona. Una subroutine ricorsiva è definita come quella che chiama se stessa direttamente o indirettamente. Chiamare direttamente una subroutine significa che la definizione della subroutine ha già l'istruzione di chiamata per chiamare la subroutine che è stata definita.

D'altra parte, la chiamata indiretta di una subroutine avviene quando una subroutine chiama un'altra subroutine, che poi chiama la subroutine originale. La ricorsione può utilizzare poche righe di codice per descrivere un'attività molto complessa. Rivolgiamo ora la nostra attenzione ai diversi tipi di ricorsione che abbiamo già accennato.

Leggi anche: I 6 migliori linguaggi di programmazione da imparare

Tipi di ricorsione

Esistono solo due tipi di ricorsione come è già stato menzionato. Vediamo come sono diversi l'uno dall'altro. La ricorsione diretta è il modo più semplice in quanto coinvolge solo un singolo passaggio per chiamare la funzione o il metodo o la subroutine originale. D'altra parte, la ricorsione indiretta comporta diversi passaggi.

La prima chiamata viene effettuata dal metodo originale a un secondo metodo, che a sua volta chiama il metodo originale. Questa catena di chiamate può presentare una serie di metodi o funzioni. In parole semplici, possiamo dire che c'è sempre una variazione nella profondità della ricorsione indiretta, e questa variazione in profondità dipende dal numero di metodi coinvolti nel processo.

La ricorsione diretta può essere utilizzata per chiamare da sola una singola funzione. D'altra parte, la ricorsione indiretta può essere utilizzata per chiamare più di un metodo o una funzione con l'aiuto di altre funzioni, e anche questo, un certo numero di volte. La ricorsione indiretta non crea un sovraccarico mentre la sua controparte diretta lo fa.

Quando si usa la ricorsione?

Ci sono situazioni in cui puoi usare la ricorsione o l'iterazione. Tuttavia, dovresti sempre scegliere una soluzione che sembra essere la soluzione più naturale per un problema. Una ricorsione è sempre un'opzione adatta quando si tratta di astrazione dei dati. Le persone usano spesso definizioni ricorsive per definire i dati e le operazioni correlate.

E non sarà sbagliato dire che la ricorsione è per lo più la soluzione naturale ai problemi associati all'implementazione di diverse operazioni sui dati. Tuttavia, ci sono alcune cose relative alla ricorsione che potrebbero non renderla la soluzione migliore per ogni problema. In queste situazioni, un'alternativa come il metodo iterativo è la soluzione migliore.

L'implementazione della ricorsione utilizza molto spazio nello stack, che spesso può causare ridondanza. Ogni volta che utilizziamo la ricorsione, chiamiamo un metodo che risulta nella creazione di una nuova istanza di quel metodo. Questa nuova istanza contiene parametri e variabili diversi, che sono archiviati nello stack e vengono presi in restituzione. Quindi, sebbene la ricorsione sia la soluzione più semplice di altre, di solito non è la più pratica.

Inoltre, non abbiamo una serie di regole predefinite che possono aiutare a scegliere l'iterazione o la ricorsione per problemi diversi. Il più grande vantaggio dell'utilizzo della ricorsione è che si tratta di un metodo conciso. Ciò rende la lettura e il mantenimento delle attività più semplici del solito. Ma i metodi ricorsivi non sono i metodi più efficienti a nostra disposizione poiché occupano molto spazio di archiviazione e consumano molto tempo durante l'implementazione.

Tenere a mente alcune cose può aiutarti a decidere se scegliere una ricorsione per un problema è la strada giusta o meno. Dovresti scegliere la ricorsione se il problema che stai per risolvere è menzionato in termini ricorsivi e la soluzione ricorsiva sembra meno complessa.

Dovresti sapere che la ricorsione, nella maggior parte dei casi, semplifica l'implementazione degli algoritmi che desideri utilizzare. Ora, se le complessità associate all'uso dell'iterazione e della ricorsione sono le stesse per un determinato problema, dovresti procedere con l'iterazione poiché le possibilità che sia più efficiente sono maggiori.

Dai un'occhiata anche a: 23 migliori corsi di programmazione informatica per ottenere un lavoro

Conclusione

Tuttavia, potrebbero esserci situazioni in cui prendere una decisione potrebbe non essere così facile. Devi scegliere tra efficienza e semplicità. Se sei un designer esperto, sapresti esattamente quando dare più importanza all'efficienza e quando scegli la semplicità o la concisione su di essa è la strada da percorrere.

Se sei curioso di conoscere la struttura dei dati, la scienza dei dati, dai un'occhiata al programma Executive PG in Data Science di IIIT-B e upGrad, creato per i professionisti che lavorano e offre oltre 10 casi di studio e progetti, workshop pratici pratici, tutoraggio con l'industria esperti, 1 contro 1 con mentori del settore, oltre 400 ore di apprendimento e assistenza al lavoro con le migliori aziende.

Qual è l'applicazione più comune della ricorsione nella vita reale?

La ricorsione è un processo in cui la funzione chiama se stessa indirettamente o direttamente per risolvere il problema. La funzione che esegue il processo di ricorsione è chiamata funzione ricorsiva. Ci sono alcuni problemi che possono essere risolti abbastanza facilmente con l'aiuto di un algoritmo ricorsivo.

L'applicazione di ricorsione nella vita reale più comune è quando si calcola quanti soldi hai in una scatola piena di Rs. 100 note. Se ci sono troppe note, potresti semplicemente chiedere al tuo amico di fare lo stesso lavoro dividendo l'intero stack in due. Una volta che entrambi hai finito di contare, sommerai entrambi i risultati per ottenere l'importo totale.

Quali sono le proprietà che deve avere una funzione ricorsiva?

Una funzione ricorsiva ha la capacità di continuare come un ciclo infinito. Ci sono due proprietà che devono essere definite per qualsiasi funzione ricorsiva per impedire che entri in un ciclo infinito. Loro sono:

1. Criteri di base – Deve esserci una condizione di base predefinita. Ogni volta che questo criterio di base viene soddisfatto, la funzione smette di chiamare se stessa.
2. Approccio progressivo – I richiami ricorsivi dovrebbero consistere in un approccio progressivo. Ogni volta che viene effettuata una chiamata ricorsiva alla funzione, dovrebbe raggiungere la condizione di base.

Quali sono i vantaggi e gli svantaggi della ricorsione?

Alcuni dei vantaggi della ricorsione sono che devi solo definire la condizione di base e il caso ricorsivo in una funzione ricorsiva. Ciò rende il codice piuttosto semplice e breve rispetto a un codice iterativo e alcuni problemi come Tree Traversal e Graph sono intrinsecamente ricorsivi.

I maggiori svantaggi della ricorsione sono che ci sono maggiori requisiti di spazio per le funzioni ricorsive rispetto a un programma iterativo perché ogni chiamata di funzione deve rimanere nello stack finché non viene soddisfatta la condizione di base e ci sono anche maggiori requisiti di tempo, perché lo stack cresce dopo ogni chiamata di funzione e la risposta finale può essere restituita solo dopo aver estratto tutti gli elementi dallo stack.