eliminare la ricorsione ovvero gestire direttamente la pila
maggio 2003ASD - eliminare la ricorsione2 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
maggio 2003ASD - eliminare la ricorsione analizziamo un algoritmo ricorsivo void treePreorder(root) { if(root == null) return; r = root.firstChild while (r != null) { treePreorder(r); r = r.nextSibling; } a bcd gfe
maggio 2003ASD - eliminare la ricorsione4 analisi esecuzione a bcd gfe void treePreorder(root) { if(root == null) return; r = root.firstChild while (r != null) { treePreorder(r); r = r.nextSibling; } root = a r = b root = b r = e root = e r = null root = a r = b root = a r = c root = a r = c root = a r = c root = a r = d root = a r = null root = b r = null root = c r = f root = f r = null root = c r = g root = g r = null root = c r = null root = d r = null
maggio 2003ASD - eliminare la ricorsione5 gestione esplicita della pila void iterativeTreePreorder(root) { if(root == null) return; pila.push(root); while(!pila.isEmpty()) { v = pila.pop(); if(v.nextSibling != null) pila.push(v.nextSibling); if(v.firstChild != null) pila.push(v.firstChild); }
maggio 2003ASD - eliminare la ricorsione6 esecuzione iterativa void iterativeTreePreorder(root) { if(root == null) return; pila.push(root); while(!pila.isEmpty()) { v = pila.pop(); if(v.nextSibling != null) pila.push(v.nextSibling); if(v.firstChild != null) pila.push(v.firstChild); } a bcd gfe ab ecec fdfd c gdgd d stato pila inizio corpo while
maggio 2003ASD - eliminare la ricorsione7 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