• Non ci sono risultati.

Eliminazione della ricorsione

N/A
N/A
Protected

Academic year: 2021

Condividi "Eliminazione della ricorsione"

Copied!
3
0
0

Testo completo

(1)

Azzolini Riccardo 2019-03-20

Eliminazione della ricorsione

1 Classificazione della ricorsione

La ricorsione si suddivide in

diretta: una procedura/funzione F chiama se stessa direttamente;

indiretta: una procedura/funzione F ne chiama un’altra G, e a sua volta G chiama F.

2 Eliminazione della ricorsione in coda

La ricorsione in coda (o ricorsione terminale) è un caso particolare di ricorsione nel quale la chiamata ricorsiva è l’ultima istruzione della funzione.

void F(x) {

if P(X) { D; }

else { E; y = g(x); F(y); } }

Essa si può sostituire con un costrutto iterativo,1senza bisogno di strutture dati aggiun- tive:

void F_it(x) {

while (!P(x)) { E; x = g(x); } D;

}

1Molti compilatori effettuano automaticamente questa sostituzione.

1

(2)

2.1 Esempio: ricerca binaria

La ricerca binaria (o dicotomica), ad esempio di un oggetto in un vettore, può essere implementata mediante ricorsione in coda:

public int binsearch(int sx, int dx, Item el) { if (sx > dx) return -1;

int x = (sx + dx) / 2;

if (el == a[x]) return x;

if (el < a[x]) return binsearch(sx, x - 1, el);

return binsearch(x + 1, dx, el);

}

Di conseguenza, si può ricavare la corrispondente versione iterativa, trasformando i parametri sx e dx in variabili locali e la ricorsione in un ciclo:

public int binsearch_it(Item el) { int sx = 0;

int dx = size - 1;

while (sx <= dx) {

int x = (sx + dx) / 2;

if (el == a[x]) return x;

if (el < a[x]) dx = x - 1;

else sx = x + 1;

}

return -1;

}

2.1.1 Complessità

Nel caso migliore, cioè se l’elemento cercato si trova in mezzo al vettore, viene effettuato un solo confronto, quindi la ricerca richiede tempo O(1) e spazio O(1) in entrambe le implementazioni.

Il caso peggiore si ha invece quando l’elemento cercato è assente. Siccome la dimensione della parte di vettore considerata si dimezza a ogni passo, il numero di confronti effettuati è asintotico alla soluzione dell’equazione di ricorrenza

c1= 1, cn= 1 + cn

2

dove n è la dimensione del vettore. Supponendo n = 2k ⇐⇒ k = log2n, si ottiene

2

(3)

c2k = 1 + c2k−1

= 1 + 1 + c2k−2

...

= 1 + 1 +· · · + c2k−k

= 1 + 1 +· · · + c1

= 1 + 1 +| · · · + 1{z }

k

= k + 1

Allora, nel caso peggiore, si effettuano Θ(log n) confronti, e di conseguenza:

• il tempo di calcolo è Θ(log n) per entrambe le implementazioni, perché ogni con- fronto richiede tempo O(1);

• lo spazio necessario è Θ(log n) per la versione ricorsiva, a causa dei record di attivazione, e O(1) per quella iterativa, che usa solo alcune variabili locali.

Ricapitolando, la ricerca binaria in un vettore di n elementi richiede in generale tempo O(log n) e spazio

• O(log n) per la versione ricorsiva;

• O(1) per la versione iterativa.

3

Riferimenti

Documenti correlati

– Si parla di ricorsionelineare quando vi è solo una chiamata ricorsiva all'interno della funzione, e di ricorsione non lineare nel caso in cui le chiamate ricorsive siano più di una.

Da allora, i monaci del tempio si alternano per spostare i dischi dal piolo originario ad un altro piolo, seguendo le rigide regole di Brahma: i dischi vanno ma- neggiati uno

Da allora, i monaci del tempio si alternano per spostare i dischi dal piolo originario ad un altro piolo, seguendo le rigide regole di Brahma: i dischi vanno ma- neggiati uno

• anche in questo caso nel corpo della funzione si attiva una sola chiamata ricorsiva, dato che le due chiamate sono alternative l’una all’altra; quindi la successione delle

• Scrivere una funzione ricorsiva (in C) che, avendo in input un array di n interi di interi positivi, dia in output TRUE se tutti gli elementi sono maggiori di 10, FALSE altrimenti..

  Individuare, in un gruppo di palline l’unica pallina di peso maggiore delle altre facendo uso di una bilancia “a basculla” (Per semplicità: il numero di palline sia una

Infatti la terza equazione darebbe 0=1, che non ha senso.. Quindi, il sistema non

[r]