70 likes | 164 Views
eliminare la ricorsione. ovvero gestire direttamente la pila. perché la ricorsione?. strumento potente per descrivere/progettare algoritmi idea fondamentale: risolvere un problema di "taglia" (dimensione dell'input) n sfruttando le soluzioni di uno o più problemi simili ma di taglia m < n
E N D
eliminare la ricorsione ovvero gestire direttamente la pila
perché la ricorsione? • strumento potente per descrivere/progettare algoritmi • idea fondamentale: risolvere un problema di "taglia" (dimensione dell'input) n sfruttando le soluzioni di uno o più problemi simili ma di taglia m < n • spesso risulta m = n - 1 ASD - eliminare la ricorsione
a b c d e f g analizziamo un algoritmo ricorsivo void treePreorder(root) { if(root == null) return; <visita root> r = root.firstChild while (r != null) { treePreorder(r); r = r.nextSibling; } } 1 4 2 7 3 5 6 ASD - eliminare la ricorsione
analisi esecuzione a void treePreorder(root) { if(root == null) return; <visita root> r = root.firstChild while (r != null) { treePreorder(r); r = r.nextSibling; } } b c d e f g root = e r = null root = f r = null root = g r = null root = b r = e root = b r = null root = c r = f root = c r = g root = c r = null root = d r = null Pila dei record di attivazione root = a r = b root = a r = b root = a r = c root = a r = c root = a r = c root = a r = d root = a r = null ASD - eliminare la ricorsione
gestione esplicita della pila void iterativeTreePreorder(root) { if(root == null) return; pila.push(root); while(!pila.isEmpty()) { v = pila.pop(); <visita v> if(v.nextSibling != null) pila.push(v.nextSibling); if(v.firstChild != null) pila.push(v.firstChild); } } ASD - eliminare la ricorsione
esecuzione iterativa void iterativeTreePreorder(root) { if(root == null) return; pila.push(root); while(!pila.isEmpty()) { v = pila.pop(); <visita v> if(v.nextSibling != null) pila.push(v.nextSibling); if(v.firstChild != null) pila.push(v.firstChild); } } a b c d e f g e c f d g d a b c d stato pila inizio corpo while ASD - eliminare la ricorsione
ricorsione vs. iterazione • vantaggi ricorsione • intuitiva ed elegante • semplifica la costruzione di algoritmi • vantaggi iterazione • non ci sono "costi nascosti" • pila gestita esplicitamente, più efficientemente rispetto alla pila dei record di attivazione del supporto runtime ASD - eliminare la ricorsione